執行緒(八)執行緒池
阿新 • • 發佈:2018-12-18
一、執行緒池
1、什麼是執行緒池? 答: 經常建立、啟動銷燬一個執行緒都是非常消耗時間的。 使用執行緒池進行管理和複用執行緒,提高程式效率。 面試答: Java執行緒池能帶來的3個好處: 1、降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。 2、提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。 3、提高執行緒的可管理性。執行緒是稀缺資源,如果無限制地建立, 不僅會消耗系統資源。還會降低系統的穩定性。 使用執行緒池可以統一分配、調優和監控,但是要合理利用。 Java使用執行緒核心走的是ThreadPoolExecutor。(建構函式)
二、使用執行緒池的方式
使用執行緒池的方式:
使用Executor 封裝好的四種執行緒池型別。
1、newCachodThreadPool建立一個可以快取執行緒池,如果執行緒池長度超過處理需要
,可靈活回收空閒執行緒,若無可回收,則新建執行緒。
2、newFixedThreadPool 建立一個定長的執行緒池。可控制執行緒最大併發數,超出的
執行緒會在佇列中等待。
3、newFixedThreadPool 建立一個定長的執行緒池。
4、newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作
執行緒來執行任務。
三、執行緒池合理配置
CPU密集、IO密集。
四、4種建立執行緒池的方式
1、newCachedThreadPool 建立可以快取的執行緒池
package com.leeue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @classDesc: 功能描述:(執行緒池四種建立方式 newCachedThreadPool 建立可快取的執行緒池) */ public class NewCachedThreadPoolDemo { public static void main(String[] args) { // 1、建立可快取的執行緒池 可以重複的利用 ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { int temp = i; newCachedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp); } }); } } }
顯示結果:本來程式是建立
10
個執行緒,這裡就建立了
7
個,說明有
3
個在複用
2、newFixedThreadPool:建立固定長度的執行緒池
package com.leeue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
* @classDesc: 功能描述:(可固定長度的執行緒池 newFixedThreadPool)
*/
public class newFixedThreadPoolDemo {
public static void main(String[] args) {
//快捷鍵 ctrl+2 +F 來建立變數名
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);
for(int i = 0; i < 10; i++) {
int temp = i;
newFixedThreadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);
}
});
}
}
}
3、newScheduledThreadPool:建立可以定時執行的執行緒池
package com.leeue;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
*
* @classDesc: 功能描述:(建立 可定時的執行緒池)
*/
public class NewScheduledThreadPoolDemo {
public static void main(String[] args) {
ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3);
for(int i = 0; i < 10; i++) {
int temp = i;
newScheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);
}
}, 3, TimeUnit.SECONDS);//定時3秒後 執行這個執行緒池
}
}
}
4、newSingleThreadExecutor:單執行緒池
package com.leeue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
* @classDesc: 功能描述:(單執行緒的執行緒池)
*/
public class NewSingleThreadScheduledDemo {
public static void main(String[] args) {
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
int temp = i;
newSingleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp);
}
});
}
}
}
5、停掉執行緒池的方法newSingleThreadExecutor.shutdown();//停掉執行緒池的方法
呼叫shoutdown()方法。
五、執行緒池原理分析
主要談:核心執行緒池、最大執行緒數
核心執行緒滿了,接下來進佇列,佇列也滿了,建立新執行緒,直到達到最大執行緒數,之後再超出,會進入拒絕rejectedExecution