ThreadFactory是一個接口,只有一個用來創建線程的方法:
Thread newThread(Runnable r);
當線程池中需要創建線程時就會調用該方法。
package com.wkcto.threadpool;
import java.util.Random;
import java.util.concurrent.*;
/**
* 自定義線程工廠
*/
public class Test04 {
public static void main(String[] args) throws InterruptedException {
//定義任務
Runnable r = new Runnable() {
@Override
public void run() {
int num = new Random().nextInt(10);
System.out.println(Thread.currentThread().getId() + "--" + System.currentTimeMillis() + "開始睡眠:" + num + "秒");
try {
TimeUnit.SECONDS.sleep(num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
//創建線程池, 使用自定義線程工廠, 采用默認的拒絕策略是拋出異常
ExecutorService executorService = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
//根據參數r接收的任務,創建一個線程
Thread t = new Thread( r );
t.setDaemon(true); //設置為守護線程, 當主線程運行結束,線程池中的線程會自動退出
System.out.println("創建了線程: " + t);
return t ;
}
});
//提交5個任務, 當給當前線程池提交的任務超過5個時,線程池默認拋出異常
for (int i = 0; i < 5; i++) {
executorService.submit(r);
}
//主線程睡眠
Thread.sleep(10000);
//主線程睡眠超時, 主線程結束, 線程池中的線程會自動退出
}
}