1. 程式人生 > >(CSDN遷移)JAVA多執行緒實現-單執行緒化執行緒池newSingleThreadExecutor

(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...");
        
    }

}