[Q&A] newSingleThreadExecutor
定义
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1,
1,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
[Q&A] FixedThreadPool
的execute()
方法的运行示意图
1)如果当前运行的线程数少于corePoolSize,则创建一个新线程来执行任务。
2)当前线程池中有一个运行的线程,将任务加入LinkedBlockingQueue。
3)线程执行完1中的任务后,会在一个无限循环中反复从LinkedBlockingQueue获取任务来执行。
常见用途
线程任务
public class Task implements Runnable {
private final String name;
public Task(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " → " + name + " Start Time = " + new Date());
processCommand();
System.out.println(Thread.currentThread().getName() + " → " + name + " End Time = " + new Date());
}
private void processCommand() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
单线程线程池 newSingleThreadExecutor
public class SingleThreadPool {
public static void main(String args[]) throws InterruptedException, ExecutionException {
System.out.println(Thread.currentThread().getName() + "线程: Start at: " + new Date());
ExecutorService exec = Executors.newSingleThreadExecutor(); // 创建大小为1的固定线程池
// 等价于 ExecutorService exec = Executors.newFixedThreadPool(1);
for (int i = 1; i < 10; i++) {
System.out.println("添加了第" + i + "个任务类");
exec.execute(new Task(String.valueOf(i)));
}
exec.shutdown();
System.out.println(Thread.currentThread().getName() + "线程: Finished all threads at:" + new Date() + ". isTerminated 判断次数 ");
}
}
执行结果分析
执行结果 |
---|
main线程: Start at: Fri May 19 21:48:50 CST 2023 |
添加了第1个任务类 |
添加了第2个任务类 |
添加了第3个任务类 |
添加了第4个任务类 |
添加了第5个任务类 |
添加了第6个任务类 |
添加了第7个任务类 |
添加了第8个任务类 |
添加了第9个任务类 |
main线程: Finished all threads at:Fri May 19 21:48:50 CST 2023. isTerminated 判断次数 |
pool-1-thread-1 → 1 Start Time = Fri May 19 21:48:50 CST 2023 |
pool-1-thread-1 → 1 End Time = Fri May 19 21:48:53 CST 2023 |
pool-1-thread-1 → 2 Start Time = Fri May 19 21:48:53 CST 2023 |
pool-1-thread-1 → 2 End Time = Fri May 19 21:48:56 CST 2023 |
pool-1-thread-1 → 3 Start Time = Fri May 19 21:48:56 CST 2023 |
pool-1-thread-1 → 3 End Time = Fri May 19 21:48:59 CST 2023 |
pool-1-thread-1 → 4 Start Time = Fri May 19 21:48:59 CST 2023 |
pool-1-thread-1 → 4 End Time = Fri May 19 21:49:02 CST 2023 |
pool-1-thread-1 → 5 Start Time = Fri May 19 21:49:02 CST 2023 |
pool-1-thread-1 → 5 End Time = Fri May 19 21:49:05 CST 2023 |
pool-1-thread-1 → 6 Start Time = Fri May 19 21:49:05 CST 2023 |
pool-1-thread-1 → 6 End Time = Fri May 19 21:49:08 CST 2023 |
pool-1-thread-1 → 7 Start Time = Fri May 19 21:49:08 CST 2023 |
pool-1-thread-1 → 7 End Time = Fri May 19 21:49:11 CST 2023 |
pool-1-thread-1 → 8 Start Time = Fri May 19 21:49:11 CST 2023 |
pool-1-thread-1 → 8 End Time = Fri May 19 21:49:14 CST 2023 |
pool-1-thread-1 → 9 Start Time = Fri May 19 21:49:14 CST 2023 |
pool-1-thread-1 → 9 End Time = Fri May 19 21:49:17 CST 2023 |
从控制台结果可以看出: |
线程池创建1 个线程来 执行这9 个任务。单例线程,任意时间池中只能有1 个线程 |
主线程的执行与线程池里的线程分开,有可能主线程结束了,但是线程池还在运行 |
它能保证线程的先后顺序执行 ,并且能保证一条线程执行完成后才开启另一条新的线程 |