(CSDN遷移)JAVA多執行緒實現-單執行緒化執行緒池newSingleThreadExecutor
JAVA通過Executors提供了四種執行緒池,單執行緒化執行緒池(newSingleThreadExecutor)、可控最大併發數執行緒池(newFixedThreadPool)、可回收快取執行緒池(newCachedThreadPool)、支援定時與週期性任務的執行緒池(newScheduledThreadPool)。本篇文章主要介紹newSingleThreadExecutor,其他三種執行緒池將在後續的文章中一一闡述。
單執行緒化執行緒池(newSingleThreadExecutor)的優點,序列執行所有任務。如果這個唯一的執行緒因為異常結束,那麼會有一個新的執行緒來替代它。此執行緒池保證所有任務的執行順序按照任務的提交順序執行。(在後續闡述(newFixedThreadPool)時,我們會再做闡述)。
使用單執行緒化執行緒池(newSingleThreadExecutor)的一般方法下程式碼所示。
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class ThreadPoolByNewSingleThreadExecutor { public static void main(String[] args) { /** * 單執行緒化的執行緒池 */ ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { final int index = i; singleThreadExecutor.execute(new Runnable() { @Override public void run() { Thread.currentThread().setName("Thread i = " + index); System.out.println(Thread.currentThread().getName() + " index = " + index); try { Thread.sleep(500); } catch (InterruptedException e) { System.out.println("ssss"); } } }); } singleThreadExecutor.shutdown(); System.out.println("on the main thread..."); } }
後續的shutdown()方法用來關閉執行緒池,拒絕新任務。執行shutdown()方法後,執行緒池狀態變為SHUTDOWN狀態,此時,不能再往執行緒池中新增新任務,否則會丟擲RejectedExecutionException異常。此時,執行緒池不會立刻退出,直到新增到執行緒池中的任務都已經處理完成,才會退出,即在終止前允許執行以前提交的任務。還有一個類似的方法shutdownNow(),執行shutdownNow()方法後,執行緒池狀態會立刻變成STOP狀態,並試圖停止所有正在執行的執行緒,不再處理還在池佇列中等待的任務,會返回那些未執行的任務。ShutdownNow()並不代表執行緒池就一定立即就能退出,它可能必須要等待所有正在執行的任務都執行完成了才能退出。
用ShutdownNow()關閉執行緒的程式碼示例
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ThreadPoolByNewSingleThreadExecutor {
public static void main(String[] args) {
/**
* 單執行緒化的執行緒池
*/
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
Thread.currentThread().setName("Thread i = " + index);
System.out.println(Thread.currentThread().getName() + " index = " + index);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
System.out.println("ssss");
}
}
});
}
try {
if (!singleThreadExecutor.awaitTermination(2*1000, TimeUnit.MILLISECONDS)) {
singleThreadExecutor.shutdownNow();
}
} catch (InterruptedException e) {
// awaitTermination方法被中斷的時候也中止執行緒池中全部的執行緒的執行。
System.out.println("awaitTermination interrupted: " + e);
singleThreadExecutor.shutdownNow();
}
System.out.println("on the main thread...");
}
}