1. 程式人生 > >(CSDN遷移) JAVA多執行緒實現-可控最大併發數執行緒池(newFixedThreadPool)

(CSDN遷移) JAVA多執行緒實現-可控最大併發數執行緒池(newFixedThreadPool)

上篇文章中介紹了單執行緒化執行緒池newSingleThreadExecutor,可控最大併發數執行緒池(newFixedThreadPool)與其最大的區別是可以通知執行多個執行緒,可以簡單的將newSingleThreadExecutor理解為newFixedThreadPool(1)。例如執行一下兩個程式:

單執行緒化執行緒池(newSingleThreadExecutor)示例:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

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("exception");
                    }
                }
            });
        }
        singleThreadExecutor.shutdown();
        System.out.println("on the main thread...");
        
    }

}

可控最大併發數執行緒池(newFixedThreadPool)示例:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolByNewFixedThreadPool {
    public static void main(String[] args) {
        
        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 10; i++) {
            final int index = i;
            newFixedThreadPool.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("exception");
                    }
                }
            });
        }
        newFixedThreadPool.shutdown();
        System.out.println("on the main thread...");
    }

}

結果從顯示上看雖然很相似,但是觀察到的執行效果確實完全不一致的,newSingleThreadPool中,只有一個執行緒,每次輸出一行後暫停0.5秒,newFixedThreadPool(3)中可以建立3個執行緒,一次輸出3行後暫停0.5秒(當然是這三個執行緒都暫停0.5秒)。

動畫對比如下所示: