Java:线程池是同时还是顺序执行任务?

时间:2012-07-18 04:27:19

标签: java

我对线程池的理解是,当你向一个线程池传递一个方法时,它从它的活动池中选择一个线程并发送该方法以便执行。我对一个线程的理解是,如果你在其中放入一些代码,它将在不停止的情况下运行代码,直到它被告知睡眠或停止。

我的问题:

当你将几个方法(大致相同的执行长度)传递给一个接一个的线程池时,线程池管理正在执行的不同线程之间的共享,以便任务几乎同时完成或者一个接一个地执行它们 - 例如,任务1进入线程1,线程1开始执行它,其中任务2的线程2没有机会运行,直到任务任务1完成,因为线程1正在运行它已经给出的代码没有任何明确的消息要睡觉 - 所以线程2将执行,任务基本上会一个接一个地完成。

基本上,我是否必须明确确保我给线程池的代码有一个中断,以便线程同时运行?或者在使用线程池管理器时我是免费获得的吗?

4 个答案:

答案 0 :(得分:3)

OP似乎正在考虑旧的协作式多任务处理方式,即线程应该睡眠/产生的方式,以便将CPU放弃到另一个线程/进程来运行。

然而,在Java中并非如此(至少对于大多数常见的JVM实现而言)。多任务处理在Java中是先发制人的。这意味着,当线程1运行时,即使您没有显式地执行任何yield / sleep,线程2也可以同时运行(通过在另一个CPU内核中切片/运行时间等)。

答案 1 :(得分:2)

1。 您在池中指定的线程数同时工作,这就是线程的用途,同时完成工作。它是并行运行

2. 例如,FixedThreadPool会有一定数量的线程,当你给它们执行一定数量的任务时,如果工作量少的话,所有的任务都会同时运行而不是池中的线程,那么只有那些执行任务所需的线程才会同时运行。

3. 对于CachedThreadPool,池中的线程数同时运行以完成工作,如果需要更多线程,CachedThreadPool将创建新线程或在此之前重用它

答案 2 :(得分:1)

如果有多个线程,它将并行运行任务。池使用所有可用线程(可用=为池配置)。

答案 3 :(得分:1)

运行顺序无法保证,这取决于很多东西;但如果任务足够长,你可以假设任务将同时运行。

相关问题