使用Java 6提供的ExecutorService接口有五種異步執行任務的方法。
ExecutorService execService = Executors.newCachedThreadPool();
這種方法的方法將創建一個線程池,該線程池會根據需要創建新線程,但是在可用之前會重用以前構造的線程。 這些池通常將提高執行許多短期異步任務的程序的性能。 如果沒有可用的現有線程,則將創建一個新線程并將其添加到池中。 60秒鐘未使用的線程將終止并從緩存中刪除。
ExecutorService execService = Executors.newFixedThreadPool(10);
這種方法的方法創建了一個線程池,該線程池可重用固定數量的線程。 創建的nThreads將在運行時處于活動狀態。 如果在所有線程都處于活動狀態時提交了其他任務,則它們將在隊列中等待,直到某個線程可用為止。
ExecutorService execService = Executors.newSingleThreadExecutor();
這種方法的方法將創建一個執行器,該執行器使用在無限制隊列上運行的單個工作線程。 確保任務按順序執行,并且在任何給定時間都不會激活一項以上的任務。
ExecutorService的方法:
execute(Runnable):在將來的某個時間執行給定命令。
Submit(Runnable): Submit方法返回一個表示執行任務的Future對象。 如果任務正確完成,則Future Object返回null。
shutdown():啟動有序關閉,在該關閉中執行先前提交的任務,但不接受任何新任務。 如果已關閉,則調用不會產生任何其他影響。
shutdownNow():嘗試停止所有正在執行的任務,暫停正在等待的任務的處理,并返回正在等待執行的任務的列表。
除了盡最大努力嘗試停止處理正在執行的任務之外,沒有任何保證。 例如,典型的實現將通過Thread.interrupt取消,因此任何無法響應中斷的任務都可能永遠不會終止。
下面是一個示例應用程序:
步驟1:建立已完成的專案
創建一個Maven項目,如下所示。 (可以使用Maven或IDE插件來創建它)。

第2步:創建新任務
通過實現如下所示的Runnable接口(創建線程)來創建新任務。 TestTask類指定將要執行的業務邏輯。
package com.otv.task;import org.apache.log4j.Logger;/*** @author onlinetechvision.com* @since 24 Sept 2011* @version 1.0.0**/
public class TestTask implements Runnable {private static Logger log = Logger.getLogger(TestTask.class);private String taskName;public TestTask(String taskName) {this.taskName = taskName;}public void run() {try {log.debug(this.taskName + " is sleeping...");Thread.sleep(3000);log.debug(this.taskName + " is running...");} catch (InterruptedException e) {e.printStackTrace();}}public String getTaskName() {return taskName;}public void setTaskName(String taskName) {this.taskName = taskName;}}
步驟3:使用newCachedThreadPool創建TestExecutorService
通過使用方法newCachedThreadPool創建TestExecutorService。 在這種情況下,將在運行時指定創建的線程數。
package com.otv;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import com.otv.task.TestTask;/*** @author onlinetechvision.com* @since 24 Sept 2011* @version 1.0.0**/
public class TestExecutorService {public static void main(String[] args) {ExecutorService execService = Executors.newCachedThreadPool();execService.execute(new TestTask("FirstTestTask"));execService.execute(new TestTask("SecondTestTask"));execService.execute(new TestTask("ThirdTestTask"));execService.shutdown();}
}
運行TestExecutorService時,輸出將如下所示:
24.09.2011 17:30:47 DEBUG (TestTask.java:21) - SecondTestTask is sleeping...
24.09.2011 17:30:47 DEBUG (TestTask.java:21) - ThirdTestTask is sleeping...
24.09.2011 17:30:47 DEBUG (TestTask.java:21) - FirstTestTask is sleeping...
24.09.2011 17:30:50 DEBUG (TestTask.java:23) - ThirdTestTask is running...
24.09.2011 17:30:50 DEBUG (TestTask.java:23) - FirstTestTask is running...
24.09.2011 17:30:50 DEBUG (TestTask.java:23) - SecondTestTask is running...
步驟4:使用newFixedThreadPool創建TestExecutorService
通過使用方法newFixedThreadPool創建TestExecutorService。 在這種情況下,將在運行時指定創建的線程數。
package com.otv;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import com.otv.task.TestTask;/*** @author onlinetechvision.com* @since 24 Sept 2011* @version 1.0.0**/
public class TestExecutorService {public static void main(String[] args) {ExecutorService execService = Executors.newFixedThreadPool(2);execService.execute(new TestTask("FirstTestTask"));execService.execute(new TestTask("SecondTestTask"));execService.execute(new TestTask("ThirdTestTask"));execService.shutdown();}
}
運行TestExecutorService時,在完成FirstTestTask和SecondTestTask的執行之后,將執行ThirdTestTask。 輸出將被視為
下面:
24.09.2011 17:33:38 DEBUG (TestTask.java:21) - FirstTestTask is sleeping...
24.09.2011 17:33:38 DEBUG (TestTask.java:21) - SecondTestTask is sleeping...
24.09.2011 17:33:41 DEBUG (TestTask.java:23) - FirstTestTask is running...
24.09.2011 17:33:41 DEBUG (TestTask.java:23) - SecondTestTask is running...
24.09.2011 17:33:41 DEBUG (TestTask.java:21) - ThirdTestTask is sleeping...
24.09.2011 17:33:44 DEBUG (TestTask.java:23) - ThirdTestTask is running...
步驟5:使用newSingleThreadExecutor創建TestExecutorService
通過使用方法newSingleThreadExecutor創建TestExecutorService。 在這種情況下,僅創建一個線程,并按順序執行任務。
package com.otv;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import com.otv.task.TestTask;/*** @author onlinetechvision.com* @since 24 Sept 2011* @version 1.0.0**/
public class TestExecutorService {public static void main(String[] args) {ExecutorService execService = Executors.newSingleThreadExecutor();execService.execute(new TestTask("FirstTestTask"));execService.execute(new TestTask("SecondTestTask"));execService.execute(new TestTask("ThirdTestTask"));execService.shutdown();}
}
當運行TestExecutorService時,FirstTestTask的執行完成后,將執行SecondTestTask和ThirdTestTask。 輸出將如下所示:
24.09.2011 17:38:21 DEBUG (TestTask.java:21) - FirstTestTask is sleeping...
24.09.2011 17:38:24 DEBUG (TestTask.java:23) - FirstTestTask is running...
24.09.2011 17:38:24 DEBUG (TestTask.java:21) - SecondTestTask is sleeping...
24.09.2011 17:38:27 DEBUG (TestTask.java:23) - SecondTestTask is running...
24.09.2011 17:38:27 DEBUG (TestTask.java:21) - ThirdTestTask is sleeping...
24.09.2011 17:38:30 DEBUG (TestTask.java:23) - ThirdTestTask is running...
步驟6:參考資料
http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html
http://tutorials.jenkov.com/java-util-concurrent/executorservice.html
參考: Online Technology Vision博客中來自我們JCG合作伙伴 Eren Avsarogullari的Java Executor服務類型 。
翻譯自: https://www.javacodegeeks.com/2012/08/java-executor-service-types.html