1、线程创建时机
1.1、submitTask
executor.submit(task);
java
ExecutorService executor = Executors.newFixedThreadPool(3);
// 创建一个 Callable 任务
Callable<Integer> task = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println("Task is being processed by " + Thread.currentThread().getName());
Thread.sleep(1000); // 模拟一些工作
return 42; // 返回结果
}
};
Future<Integer> future = executor.submit(task);
1.2、addWorker
java
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
1.3、创建线程&跟worker绑定
java
Worker(Runnable firstTask) {
setState(-1); // inhibit interrupts until runWorker
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);
}
this.thread = getThreadFactory().newThread(this);
这里是worker跟线程关联的核心,new Thread 的时候把woker作为runable传进去了,后面thread.start()的时候,会回调worker的run()方法,这样线程就跟worker绑定了。
java
if (workerAdded) {
t.start();
workerStarted = true;
}
启动线程,回调worker 的 runWorker方法
1.4、线程复用核心
java
final void runWorker(Worker w) {
Thread wt = Thread.currentThread();
Runnable task = w.firstTask;
w.firstTask = null;
w.unlock(); // allow interrupts
boolean completedAbruptly = true;
try {
while (task != null || (task = getTask()) != null) {
w.lock();
while循环,有任务执行,无任务则block,等待任务,这样线程就能做复用了。