<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
執行緒池主要解決兩個問題:一是當執行大量非同步任務時執行緒池能夠提供較好的效能。在不使用執行緒池時,每當需要執行非同步任務時直接new一個執行緒來執行,而執行緒的建立和銷燬都是需要開銷的。執行緒池裡面的執行緒是可複用的,不需要每次執行非同步任務時都重新建立和銷燬執行緒。二是執行緒池提供了一種資源限制和管理手段,比如可以限制執行緒的個數,動態新增執行緒等。每個ThreadPoolExecutor也保留了一些基本的統計資料,比如當前執行緒池完成的任務數目等。
我們首先來看一下類圖
Excecutor是一個工具類,裡面提供了許多靜態方法,這些方法根據使用者選擇返回不同的執行緒池範例。ThreadPool繼承了AbstractExecutorService。
下面我們看一下原始碼,
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); private static final int COUNT_BITS = Integer.SIZE - 3; private static final int CAPACITY = (1 << COUNT_BITS) - 1; // runState is stored in the high-order bits private static final int RUNNING = -1 << COUNT_BITS; private static final int SHUTDOWN = 0 << COUNT_BITS; private static final int STOP = 1 << COUNT_BITS; private static final int TIDYING = 2 << COUNT_BITS; private static final int TERMINATED = 3 << COUNT_BITS;
成員變數ctl是一個Integer的原子變數,用來記錄當前執行緒池狀態和執行緒池中的執行緒個數,有點類似於ReentrantReadWriteLock使用一個變數來儲存兩種資訊。
執行緒池一共有五種狀態:
執行緒池狀態轉換如下:
合理利用執行緒池能夠帶來三個好處:
在java.util.concurrent.Executors執行緒工廠類裡面提供了一些靜態工廠,生成一些常用的執行緒池。官方建議使用Executors工程類來建立執行緒池物件。
Executors類中有個建立執行緒池的方法如下:
獲取到了一個執行緒池ExecutorService 物件,那麼怎麼使用呢,在這裡定義了一個使用執行緒池物件的方法如下:
Future介面:用來記錄執行緒任務執行完畢後產生的結果。
使用執行緒池中執行緒物件的步驟:
Runnable實現類程式碼:
public class MyRunnable implements Runnable { @Override public void run() { System.out.println("我要一個教練"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("教練來了: " + Thread.currentThread().getName()); System.out.println("教我游泳,交完後,教練回到了游泳池"); } } public class ThreadPoolDemo { public static void main(String[] args) { // 建立執行緒池物件 ExecutorService service = Executors.newFixedThreadPool(2);//包含2個執行緒物件 // 建立Runnable範例物件 MyRunnable r = new MyRunnable(); //自己建立執行緒物件的方式 // Thread t = new Thread(r); // t.start(); ---> 呼叫MyRunnable中的run() // 從執行緒池中獲取執行緒物件,然後呼叫MyRunnable中的run() service.submit(r); // 再獲取個執行緒物件,呼叫MyRunnable中的run() service.submit(r); service.submit(r); // 注意:submit方法呼叫結束後,程式並不終止,是因為執行緒池控制了執行緒的關閉。 // 將使用完的執行緒又歸還到了執行緒池中 // 關閉執行緒池 //service.shutdown(); } }
Callable測試程式碼:
<T> Future<T> submit(Callable<T> task) : 獲取執行緒池中的某一個執行緒物件,並執行.
Future : 表示計算的結果.
V get() : 獲取計算完成的結果。
public class ThreadPoolDemo2 { public static void main(String[] args) throws Exception { // 建立執行緒池物件 ExecutorService service = Executors.newFixedThreadPool(2);//包含2個執行緒物件 // 建立Runnable範例物件 Callable<Double> c = new Callable<Double>() { @Override public Double call() throws Exception { return Math.random(); } }; // 從執行緒池中獲取執行緒物件,然後呼叫Callable中的call() Future<Double> f1 = service.submit(c); // Futur 呼叫get() 獲取運算結果 System.out.println(f1.get()); Future<Double> f2 = service.submit(c); System.out.println(f2.get()); Future<Double> f3 = service.submit(c); System.out.println(f3.get()); } }
執行緒池的練習
public class Demo04 { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService pool = Executors.newFixedThreadPool(3); SumCallable sc = new SumCallable(100); Future<Integer> fu = pool.submit(sc); Integer integer = fu.get(); System.out.println("結果: " + integer); SumCallable sc2 = new SumCallable(200); Future<Integer> fu2 = pool.submit(sc2); Integer integer2 = fu2.get(); System.out.println("結果: " + integer2); pool.shutdown(); } }
public class SumCallable implements Callable<Integer> { private int n; public SumCallable(int n) { this.n = n; } @Override public Integer call() throws Exception { // 求1-n的和? int sum = 0; for (int i = 1; i <= n; i++) { sum += i; } return sum; } }
到此這篇關於Java並行包執行緒池ThreadPoolExecutor的實現的文章就介紹到這了,更多相關Java並行包執行緒池ThreadPoolExecutor內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45