我在写的许多应用程序中都使用了多线程技术。在阅读更多相关资料时,我接触到了ThreadPoolExecutors
技术。就场景而言,我不能区分这两种方式。
但是,我理解的是,当我有一个任务需要分成多个小任务来利用CPU以加快工作速度时,应该使用多线程技术。如果我有一组任务,并且每个任务可以独立运行,则应该使用ThreadPoolExecutor
技术。
如果我理解有误,请您指正。谢谢!
我在写的许多应用程序中都使用了多线程技术。在阅读更多相关资料时,我接触到了ThreadPoolExecutors
技术。就场景而言,我不能区分这两种方式。
但是,我理解的是,当我有一个任务需要分成多个小任务来利用CPU以加快工作速度时,应该使用多线程技术。如果我有一组任务,并且每个任务可以独立运行,则应该使用ThreadPoolExecutor
技术。
如果我理解有误,请您指正。谢谢!
ThreadPoolExecutor
只是一个高级API,允许你在多线程中运行任务,而不需要处理底层Thread API。因此,区分多线程和ThreadPoolExecutor并没有太多意义。ThreadPoolExecutor
,但大多数都允许多个线程并发运行。通常,您会使用Executor Service并使用Executors
工厂。ExecutorService executor = Executors.newFixedThreadPool(10);
将在10个线程中运行您提交的任务。ThreadPoolExecutor
是一种进行多线程操作的方式。通常在以下情况下使用:
Java 7还有另一个内置类称为ForkJoinPool
,通常用于Map-Reduce类型的操作。例如,可以使用ForkJoinPool实现归并排序,通过在每个分支点将数组分成一半,等待结果,然后将结果合并在一起。
ThreadPoolExecutor是一种多线程形式,具有比直接使用Threads更简单的API,您可以提交任务。但是,任务可以提交其他任务,因此它们不需要是独立的。至于将任务划分为子任务,您可能会考虑JDK7中的新fork/join API。
来自ThreadPoolExecutor的源代码文档
/*
* <p>Thread pools address two different problems: they usually
* provide improved performance when executing large numbers of
* asynchronous tasks, due to reduced per-task invocation overhead,
* and they provide a means of bounding and managing the resources,
* including threads, consumed when executing a collection of tasks.
* Each {@code ThreadPoolExecutor} also maintains some basic
* statistics, such as the number of completed tasks.
*
* <p>To be useful across a wide range of contexts, this class
* provides many adjustable parameters and extensibility
* hooks. However, programmers are urged to use the more convenient
* {@link Executors} factory methods {@link
* Executors#newCachedThreadPool} (unbounded thread pool, with
* automatic thread reclamation), {@link Executors#newFixedThreadPool}
* (fixed size thread pool) and {@link
* Executors#newSingleThreadExecutor} (single background thread), that
* preconfigure settings for the most common usage
* scenarios.
*/
ThreadPoolExecutor
是实现并发的一种方式。有许多实现并发的方式:
Executors框架提供了不同的API。下面列出了一些重要的API。
static ExecutorService newFixedThreadPool(int nThreads)
static ExecutorService newCachedThreadPool()
创建一个线程池,按需创建新的线程,但会在可用时重复使用先前构建的线程。
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
static ExecutorService newWorkStealingPool()
创建一个工作窃取线程池,使用所有可用的处理器作为目标并行级别。
请查看下面的SE问题: