多執行緒--05(執行緒池的建立)
執行緒池: 什麼是執行緒池: Java中的執行緒池是應用場景最多的併發框架,幾乎所有需要非同步或併發執行任務的程式,都可以使用執行緒池,在併發的過程中合理的使用執行緒池能夠帶來3個好處。 降低資源的消耗:通過重複利用已建立執行緒,降低執行緒的建立和執行緒銷燬的所造成資源的消耗; 提高響應速度:當任務達到時,任務可以不需要等待執行緒的建立就可以立即執行。 提高執行緒的可管理性:執行緒時稀缺資源,如果無限制的建立,不僅會消耗資源,還會降低系統的穩定性,使用執行緒池可以進行統一分配,調優和監控。但是要做到合理利用。 使用執行緒池的原因: 經常建立,啟動,銷燬一個執行緒都非常耗時間。使用執行緒池進行管理複用執行緒,提高程式的效率。 java中使用執行緒池核心是ThreadPoolExecutor.方法。 使用執行緒池的方式: Executor封裝了四種執行緒池型別; 1.new CachedThreadPool 建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活的回收空閒執行緒,若無可回收,則建立執行緒。 2.new FixedThreadPool建立一個定長的執行緒池,可控制執行緒最大的併發量,超出的執行緒會在佇列中等待。 3.new ScheduledThreadPool建立一個定長執行緒池,支援定時和週期行執行任務。 4.newSingleThreadExecutor建立一個單執行緒池化的執行緒池,他只會使用唯一工作的執行緒來執行任務,保證所有的執行緒按照順序執行(FIFO,LIFO)執行。 執行緒池的合理配置: cpu密集和I/o密集。
package com.itmayiedu.day04;
import java.util.concurrent.*;
/**
*
* 執行緒池的建立方法
*/
public class ThreadPoolExecutroDemo01 {
public static void main(String[] args) {
test01();
// test02();
// test03();
// test04();
}
//1。建立可快取的執行緒池 可重複利用
public static void test01(){
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
int temp = i + 1;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("ThreadName:" + Thread.currentThread().getName() + " i: " + temp);
}
});
}
executorService.shutdown();//執行緒池的停止 會等待所有的執行緒執行完畢才會停止執行緒。
}
//2.建立可定長度的執行緒池
public static void test02(){
ExecutorService executorService = Executors.newFixedThreadPool(3);//建立3個執行緒池
for (int i = 0; i <10 ; i++) {
int temp =i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("ThreadName:"+Thread.currentThread().getName()+" i: "+temp);
}
});
}
executorService.shutdown();//執行緒的停止,會等待所有的執行緒執行完畢才會停止。
}
//3.建立可定時的執行緒池,指定長度的執行緒池
public static void test03(){
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
for (int i = 0; i <10 ; i++) {
int temp =i;
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
System.out.println("ThreadName: "+Thread.currentThread().getName()+" i:"+temp);
}
},3, TimeUnit.SECONDS);
}
scheduledExecutorService.shutdown();//執行緒的停止,會等待所有的線=執行緒執行完畢後才會停止
}
//建立單執行緒執行緒池
public static void test04(){
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i <10 ; i++) {
int temp =i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);
}
});
}
executorService.shutdown();//執行緒的停止,會等待所有的執行緒執行完畢之後才會停止
}
}