1

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

我的问题:

当您将几个方法(大致相等的长度以执行)一个接一个地传递给线程池时,线程池是否管理正在执行的不同线程之间的共享,以便任务几乎同时完成或一个接一个地执行它们 - 例如, 任务 1 进入线程 1,线程 1 开始执行它,线程 2 和任务 2 直到任务任务 1 完成之前没有机会运行,因为线程 1 正在运行它已经给出的代码而没有任何显式消息休眠 - 因此线程 2 将执行,任务将一个接一个地完成。

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

4

4 回答 4

3

OP 似乎以旧的协作多任务的方式思考,即线程应该休眠/屈服以便将 CPU 让给另一个线程/进程运行。

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

于 2012-07-18T04:48:52.813 回答
2

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

2.比如FixedThreadPool,会有一定数量的线程,当你给它们一定数量的任务要执行时,全部同时运行,如果工作数量少于池中的线程,那么只有那些执行任务所需的许多线程将同时运行。

3.如果是CachedThreadPool,池中的线程数同时运行完成工作,如果需要更多线程,CachedThreadPool会创建新的或者直到它重用它。

于 2012-07-18T04:29:10.010 回答
1

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

于 2012-07-18T04:32:11.840 回答
1

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

于 2012-07-18T04:32:40.313 回答