我在我編寫的許多應用程序中使用了多線程。在閱讀更多時,我遇到了ThreadPoolExecutors
。我無法區分這兩種情況。MultiThreading Vs ThreadPoolExecutor
我仍然理解的是,當我有一項任務時,我應該使用多線程,我想將任務分成多個小任務,以便利用CPU並更快地完成工作。當我有一組任務並且每個任務可以獨立運行時使用ThreadPoolExecutor
。
如果我錯了,請糾正我。謝謝
我在我編寫的許多應用程序中使用了多線程。在閱讀更多時,我遇到了ThreadPoolExecutors
。我無法區分這兩種情況。MultiThreading Vs ThreadPoolExecutor
我仍然理解的是,當我有一項任務時,我應該使用多線程,我想將任務分成多個小任務,以便利用CPU並更快地完成工作。當我有一組任務並且每個任務可以獨立運行時使用ThreadPoolExecutor
。
如果我錯了,請糾正我。謝謝
A ThreadPoolExecutor
只是一個高級API,使您可以在多線程中運行任務,而無需處理低級別的線程API。因此,區分多線程和ThreadPoolExecutor並沒有什麼意義。
有很多ThreadPoolExecutor
s的味道,但其中大多數允許多個線程並行運行。通常,您將使用Executor Service並使用Executors
工廠。
例如,ExecutorService executor = Executors.newFixedThreadPool(10);
將運行您在10個線程中提交的任務。
ThreadPoolExecutor是一種多線程形式,使用比直接使用線程更簡單的API,您可以在其中提交任務。但是,任務可以提交其他任務,因此它們不必是獨立的。至於將任務分成子任務,您可能會想到JDK7中的新fork/join API。
線程池(executors)是多線程的一種形式,特別是單生產者 - 多消費者模式的實現,其中一個線程反覆將工作放入隊列中供工作線程隊執行。它使用普通線程來實現,並帶來以下好處:
鑑於上述情況,確實池適用於通常獨立於其他任務並且通常是短暫的任務(長I/O操作將僅從池中綁定線程,而不會能夠做其他任務)。
ThreadPoolExecutor
是多線程的一種方式。它通常用在當你
Java 7還有另一個內置類,稱爲ForkJoinPool
,它通常用於Map-Reduce類型的操作。例如,可以想象使用ForkJoinPool實現合併排序,方法是在每個叉點處將數組分割爲1/2,等待結果並將結果合併到一起。
/*
* <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問題看一看:
這是我的理解也是如此。使用ThreadPoolExecutor進行**獨立**線程和Multithread進行**除法/征服**方法 – gtgaxiola