newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1,
1,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
SingleThreadExecutor是使用单个worker线程的Executor |
SingleThreadExecutor的corePoolSize和maximumPoolSize被设置为1 。其他参数与FixedThreadPool相同。 |
SingleThreadExecutor使用无界队列LinkedBlockingQueue 作为线程池的工作队列(队列的容量为Integer.MAX_VALUE)。SingleThreadExecutor使用无界队列作为工作队列对线程池带来的影响与FixedThreadPool相同,这里就不赘述了。 |

|
1)如果当前运行的线程数少于corePoolSize(即线程池中无运行的线程),则创建一个新线程来执行任务。 |
2)在线程池完成预热之后(当前线程池中有一个运行的线程),将任务加入LinkedBlockingQueue 。 |
3)线程执行完1 中的任务后,会在一个无限循环中反复从LinkedBlockingQueue获取任务来执行。 |
常见用途
参考:Executor框架的成员
线程任务
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 个线程 |
主线程的执行与线程池里的线程分开,有可能主线程结束了,但是线程池还在运行 |
它能保证线程的先后顺序执行 ,并且能保证一条线程执行完成后才开启另一条新的线程 |
还没有评论,来说两句吧...