java建立執行緒池的幾種方式(程式碼)
阿新 • 來源:網路 • 發佈:2023-02-04
```java
package com.example.demo.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPoolTest {
public static void main(String[] args) {
// cacheThreadPool();
// fixTheadPoolTest();
// singleTheadPoolTest();
// scheduleThreadPool();
}
/**
* 1.建立一個可快取的執行緒池。如果執行緒池的大小超過了處理任務所需要的執行緒,那麼就會回收部分空閒(60秒不執行任務)的執行緒<br>
* 2.當任務數增加時,此執行緒池又可以智慧的新增新執行緒來處理任務<br>
* 3.此執行緒池不會對執行緒池大小做限制,執行緒池大小完全依賴於作業系統(或者說JVM)能夠建立的最大執行緒大小<br>
*/
public static void cacheThreadPool() {
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 1; i <= 10; i++) {
final int ii = i;
try {
Thread.sleep(ii * 1);
} catch (InterruptedException e) {
e.printStackTrace();
}
cachedThreadPool.execute(()->System.out.println("執行緒名稱:" + Thread.currentThread().getName() + ",執行" + ii));
}
}
/**
* 1.建立固定大小的執行緒池。每次提交一個任務就建立一個執行緒,直到執行緒達到執行緒池的最大大小<br>
* 2.執行緒池的大小一旦達到最大值就會保持不變,如果某個執行緒因為執行異常而結束,那麼執行緒池會補充一個新執行緒<br>
* 3.因為執行緒池大小為3,每個任務輸出index後sleep 2秒,所以每兩秒列印3個數字,和執行緒名稱<br>
*/
public static void fixTheadPoolTest() {
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int ii = i;
fixedThreadPool.execute(() -> {
System.out.println("執行緒名稱:" + Thread.currentThread().getName() + ",執行" + ii);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
/**
*建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行
*/
public static void singleTheadPoolTest() {
ExecutorService pool = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int ii = i;
pool.execute(() -> {
try {
System.out.println(Thread.currentThread().getName() + "=>" + ii);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
/**
* 建立一個定長執行緒池,支援定時及週期性任務執行。延遲執行
*/
public static void scheduleThreadPool() {
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
Runnable r1 = () -> System.out.println("執行緒名稱:" + Thread.currentThread().getName() + ",執行:3秒後執行");
scheduledThreadPool.schedule(r1, 3, TimeUnit.SECONDS);
Runnable r2 = () -> System.out.println("執行緒名稱:" + Thread.currentThread().getName() + ",執行:延遲2秒後每3秒執行一次");
scheduledThreadPool.scheduleAtFixedRate(r2, 10, 3, TimeUnit.SECONDS);
Runnable r3 = () -> System.out.println("執行緒名稱:" + Thread.currentThread().getName() + ",執行:普通任務");
for (int i = 0; i < 5; i++) {
scheduledThreadPool.execute(r3);
}
}
}
