麻烦理解Java线程

问题描述:

我很抱歉,我从python学到了多处理技术,并且我在理解Java的方法时遇到了一些麻烦。在python中,我可以说我想要一个4进程池,然后将一堆工作发送到我的程序中,并且一次可以处理4个项目。我意识到,用Java来说,我需要使用线程来实现这个相同的任务,而且到目前为止它似乎工作得非常好。但我不喜欢python,我的cpu(s)没有得到100%的利用率(他们大约70-80%),我怀疑它是我创建线程的方式(代码是相同的python/java和程序是独立的)。在Java中,我不知道如何创建一个线程,所以我创建一个线程在列表中我要处理,这样每一个项目:麻烦理解Java线程

for (int i = 0; i < 500; i++) { 
     Runnable task = new MyRunnable(10000000L + i); 
     Thread worker = new Thread(task); 
     // We can set the name of the thread 
     worker.setName(String.valueOf(i)); 
     // Start the thread, never call method run() direct 
     worker.start(); 
     // Remember the thread for later usage 
     threads.add(worker); 
    } 

我把它从here。我的问题是这是启动线程的正确方式,还是有办法让java本身管理线程的数量,使其最优?我和所有我猜想的一样,希望我的代码尽可能快地运行,并且我试图了解如何分辨和解决可能由于创建的线程太多而引起的任何问题。这不是一个大问题,只是对它在java引擎下的工作原理感到好奇。

谢谢!

看看在Java Executor API。例如,见article

虽然创建线程比以前要便宜得多,但创建大量线程(每个线程可以运行一个例子)并不是要走的路 - 创建它们仍然存在开销,而且您最终会导致过多的上下文切换。

Executor API允许您为执行Runnable任务创建各种类型的线程池,因此您可以重用线程,灵活地管理创建的数量,并避免每个线程可运行的开销。

模型(非多处理)的Java线程模型和Python 线程真的非常相似,顺便说一句。在Python中没有全局解释器锁,因此通常不需要分离多个进程。

+0

+1非常感谢。我对线程有这种感觉,但是因为我无法控制它们的产生(我这样做),所以我无法绕过并进行更多测试。我认为Executor正是我可以用来做到这一点的。还有一个问题(有点相关),执行器是否管理一个静态数量的线程,或者如果存在多余的容量,exector会根据需要自动产生(或者让)线程? – 2012-03-01 00:26:38

+0

两者都是可能的,具体取决于您是创建固定线程池还是创建缓存线程池。 – DNA 2012-03-01 08:36:21

您使用Executor,其实现处理线程池,决定多少,等等。请参阅the Java tutorial了解大量示例。

一般来说,除非是非常简单的事情,否则在Java中不使用裸线程。相反,会有一些更高级的API接收您的Runnable或Task,并知道该怎么做。

+0

+1。 Executor和ExecutorServices是在核心之间分配任务的方式。 – 2012-02-29 23:26:27

+0

非常感谢乔希,我会确定。更深入地观察执行者并玩耍。再次感谢! – 2012-03-01 00:23:20

线程是一个“低级”API。

根据你想要做什么,以及你使用的Java版本,它们是更好的解决方案。 如果你使用的Java 7,如果你的工作允许的话,你可以使用fork/join框架:http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html

但是,看看在Java并发教程:http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html