(CSDN遷移) JAVA多執行緒實現-可控最大併發數執行緒池(newFixedThreadPool)
阿新 • • 發佈:2018-12-04
上篇文章中介紹了單執行緒化執行緒池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秒)。
動畫對比如下所示: