MultiThreading与ThreadPoolExecutor

Pit*_*ger 8 java multithreading java.util.concurrent threadpoolexecutor

我在我写的许多应用程序中使用过多线程.在阅读更多内容时,我遇到了ThreadPoolExecutors.我无法区分这两种情况.

我仍然理解的是,当我有一项任务时,我应该使用多线程我想将任务分成多个小任务来利用CPU并更快地完成工作.而且使用ThreadPoolExecutor的时候我有一组任务和每个任务可以运行相互独立的.

如果我错了,请纠正我.谢谢

ass*_*ias 18

A ThreadPoolExecutor只是一个高级API,使您可以在多个线程中运行任务,而无需处理低级Thread API.因此,区分多线程和ThreadPoolExecutor并没有多大意义.

有很多种ThreadPoolExecutors,但大多数都允许多个线程并行运行.通常,您将使用Executor服务并使用Executors工厂.

例如,a ExecutorService executor = Executors.newFixedThreadPool(10);将运行您在10个线程中提交的任务.


Mat*_*att 9

ThreadPoolExecutor是多线程的一种方式.它通常在您使用时使用

  1. 有独立的操作,不需要协调(虽然没有什么阻止你协调,但你必须小心)
  2. 想要限制一次执行的操作的容量,并且(可选)如果池当前在所有线程中工作,则希望在执行时排队操作.

Java 7有另一个内置的类叫做a ForkJoinPool,它通常用于Map-Reduce类型的操作.例如,可以想象使用ForkJoinPool实现合并排序,方法是在每个叉点处将数组拆分为1/2,等待结果,并将结果合并在一起.


Tud*_*dor 7

线程池(执行器)是多线程的一种形式,特别是单个生产者的实现 - 多个消费者模式,其中线程重复将工作放入队列中以供工作线程团队执行.它使用常规线程实现,并带来以下好处:

  • 线程匿名 - 你没有明确地控制哪个线程做什么; 只需启动任务,它们将由池处理.
  • 它封装了一个工作队列和线程团队 - 无需费心实现自己的线程安全队列和循环线程.
  • 负载平衡 - 由于工作人员在完成以前的任务时接受新任务,因此只要有足够多的任务可用,工作就会均匀分布.
  • 线程回收 - 只需在开始时创建一个单独的池,继续为其提供任务.每次需要完成工作时都无需继续启动和杀死线程.

鉴于上述情况,池确实适用于通常彼此独立且通常短暂的任务(长I/O操作只会占用池中不能执行其他任务的线程) ).