【71期】面試官:對并發(fā)熟悉嗎?談?wù)勀銓ava中常用的幾種線程池的理解
閱讀本文大概需要 8 分鐘。
來自:cnblogs.com/aaron911/p/6213808.html
1. 為什么使用線程池
2. 使用線程池的風險
2.1 死鎖
死鎖的最簡單情形是:線程 A 持有對象 X 的獨占鎖,并且在等待對象 Y 的鎖,而線程 B 持有對象 Y 的獨占鎖,卻在等待對象 X 的鎖。除非有某種方法來打破對鎖的等待(Java 鎖定不支持這種方法),否則死鎖的線程將永遠等下去。
2.2 資源不足
2.3?線程泄漏
3. 有效使用線程池的準則
4. 線程池的大小設(shè)置
最佳線程數(shù)目 = ((線程等待時間+線程CPU時間)/線程CPU時間 )* CPU數(shù)目最佳線程數(shù)目 = (線程等待時間與線程CPU時間之比 + 1)* CPU數(shù)目5. 常用的幾種線程池
5.1 newCachedThreadPool
工作線程的創(chuàng)建數(shù)量幾乎沒有限制(其實也有限制的,數(shù)目為Interger. MAX_VALUE), 這樣可靈活的往線程池中添加線程。
如果長時間沒有往線程池中提交任務(wù),即如果工作線程空閑了指定的時間(默認為1分鐘),則該工作線程將自動終止。終止后,如果你又提交了新的任務(wù),則線程池重新創(chuàng)建一個工作線程。
在使用CachedThreadPool時,一定要注意控制任務(wù)的數(shù)量,否則,由于大量線程同時運行,很有會造成系統(tǒng)癱瘓。
package?test;
import?java.util.concurrent.ExecutorService;
import?java.util.concurrent.Executors;
public?class?ThreadPoolExecutorTest?{
?public?static?void?main(String[]?args)?{
??ExecutorService?cachedThreadPool?=?Executors.newCachedThreadPool();
??for?(int?i?=?0;?i?10;?i++)?{
???final?int?index?=?i;
???try?{
????Thread.sleep(index?*?1000);
???}?catch?(InterruptedException?e)?{
????e.printStackTrace();
???}
???cachedThreadPool.execute(new?Runnable()?{
????public?void?run()?{
?????System.out.println(index);
????}
???});
??}
?}
}
5.2 newFixedThreadPool
package?test;
import?java.util.concurrent.ExecutorService;
import?java.util.concurrent.Executors;
public?class?ThreadPoolExecutorTest?{
?public?static?void?main(String[]?args)?{
??ExecutorService?fixedThreadPool?=?Executors.newFixedThreadPool(3);
??for?(int?i?=?0;?i?10;?i++)?{
???final?int?index?=?i;
???fixedThreadPool.execute(new?Runnable()?{
????public?void?run()?{
?????try?{
??????System.out.println(index);
??????Thread.sleep(2000);
?????}?catch?(InterruptedException?e)?{
??????e.printStackTrace();
?????}
????}
???});
??}
?}
}
5.3 newSingleThreadExecutor
package?test;
import?java.util.concurrent.ExecutorService;
import?java.util.concurrent.Executors;
public?class?ThreadPoolExecutorTest?{
?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()?{
????public?void?run()?{
?????try?{
??????System.out.println(index);
??????Thread.sleep(2000);
?????}?catch?(InterruptedException?e)?{
??????e.printStackTrace();
?????}
????}
???});
??}
?}
}
5.4 newScheduleThreadPool
package?test;
import?java.util.concurrent.Executors;
import?java.util.concurrent.ScheduledExecutorService;
import?java.util.concurrent.TimeUnit;
public?class?ThreadPoolExecutorTest?{
?public?static?void?main(String[]?args)?{
??ScheduledExecutorService?scheduledThreadPool?=?Executors.newScheduledThreadPool(5);
??scheduledThreadPool.schedule(new?Runnable()?{
???public?void?run()?{
????System.out.println("delay?3?seconds");
???}
??},?3,?TimeUnit.SECONDS);
?}
}
package?test;
import?java.util.concurrent.Executors;
import?java.util.concurrent.ScheduledExecutorService;
import?java.util.concurrent.TimeUnit;
public?class?ThreadPoolExecutorTest?{
?public?static?void?main(String[]?args)?{
??ScheduledExecutorService?scheduledThreadPool?=?Executors.newScheduledThreadPool(5);
??scheduledThreadPool.scheduleAtFixedRate(new?Runnable()?{
???public?void?run()?{
????System.out.println("delay?1?seconds,?and?excute?every?3?seconds");
???}
??},?1,?3,?TimeUnit.SECONDS);
?}
}
推薦閱讀:
【70期】面試官:對并發(fā)熟悉嗎?談?wù)剬olatile的使用及其原理
【69期】面試官:對并發(fā)熟悉嗎?談?wù)劸€程間的協(xié)作(wait/notify/sleep/yield/join)
【68期】面試官:對并發(fā)熟悉嗎?說說Synchronized及實現(xiàn)原理
微信掃描二維碼,關(guān)注我的公眾號
朕已閱?
評論
圖片
表情

