7

我在我編寫的許多應用程序中使用了多線程。在閱讀更多時,我遇到了ThreadPoolExecutors。我無法區分這兩種情況。MultiThreading Vs ThreadPoolExecutor

我仍然理解的是,當我有一項任務時,我應該使用多線程,我想將任務分成多個小任務,以便利用CPU並更快地完成工作。當我有一組任務並且每個任務可以獨立運行時使用ThreadPoolExecutor

如果我錯了,請糾正我。謝謝

+1

這是我的理解也是如此。使用ThreadPoolExecutor進行**獨立**線程和Multithread進行**除法/征服**方法 – gtgaxiola

回答

17

A ThreadPoolExecutor只是一個高級API,使您可以在多線程中運行任務,而無需處理低級別的線程API。因此,區分多線程和ThreadPoolExecutor並沒有什麼意義。

有很多ThreadPoolExecutor s的味道,但其中大多數允許多個線程並行運行。通常,您將使用Executor Service並使用Executors工廠。

例如,ExecutorService executor = Executors.newFixedThreadPool(10);將運行您在10個線程中提交的任務。

1

ThreadPoolExecutor是一種多線程形式,使用比直接使用線程更簡單的API,您可以在其中提交任務。但是,任務可以提交其他任務,因此它們不必是獨立的。至於將任務分成子任務,您可能會想到JDK7中的新fork/join API。

6

線程池(executors)是多線程的一種形式,特別是單生產者 - 多消費者模式的實現,其中一個線程反覆將工作放入隊列中供工作線程隊執行。它使用普通線程來實現,並帶來以下好處:

  • 線程匿名 - 您不明確控制哪個線程做什麼;只是解僱任務,他們將在游泳池處理。
  • 它封裝了一個工作隊列和線程組 - 無需打擾實現您自己的線程安全隊列和循環線程。
  • 負載均衡 - 由於工作人員在完成前一個任務時完成新任務,所以工作是均勻分佈的,只要有足夠多的任務可用。
  • 線程回收 - 只需在開始時創建一個池,然後繼續爲其提供任務。每次需要完成工作時,無需繼續啓動和消除線程。

鑑於上述情況,確實池適用於通常獨立於其他任務並且通常是短暫的任務(長I/O操作將僅從池中綁定線程,而不會能夠做其他任務)。

9

ThreadPoolExecutor是多線程的一種方式。它通常用在當你

  1. 有不需要協調獨立操作(雖然沒有什麼能阻止你 的協調,但你必須要小心)
  2. 希望限制的能力有多少操作你」立即執行,並且(可選地)想要在執行時排隊操作,如果池當前在所有線程中工作。

Java 7還有另一個內置類,稱爲ForkJoinPool,它通常用於Map-Reduce類型的操作。例如,可以想象使用ForkJoinPool實現合併排序,方法是在每個叉點處將數組分割爲1/2,等待結果並將結果合併到一起。

1

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問題看一看:

java Fork/Join pool, ExecutorService and CountDownLatch

How to properly use Java Executor?