单线程线程池 newSingleThreadExecutor

╰+攻爆jí腚メ 2024-03-22 19:36 151阅读 0赞

newSingleThreadExecutor

  1. public static ExecutorService newSingleThreadExecutor() {
  2. return new FinalizableDelegatedExecutorService
  3. (new ThreadPoolExecutor(1,
  4. 1,
  5. 0L,
  6. TimeUnit.MILLISECONDS,
  7. new LinkedBlockingQueue<Runnable>()));
  8. }














SingleThreadExecutor是使用单个worker线程的Executor
SingleThreadExecutor的corePoolSize和maximumPoolSize被设置为1。其他参数与FixedThreadPool相同。
SingleThreadExecutor使用无界队列LinkedBlockingQueue作为线程池的工作队列(队列的容量为Integer.MAX_VALUE)。SingleThreadExecutor使用无界队列作为工作队列对线程池带来的影响与FixedThreadPool相同,这里就不赘述了。

在这里插入图片描述


















1)如果当前运行的线程数少于corePoolSize(即线程池中无运行的线程),则创建一个新线程来执行任务。
2)在线程池完成预热之后(当前线程池中有一个运行的线程),将任务加入LinkedBlockingQueue
3)线程执行完1中的任务后,会在一个无限循环中反复从LinkedBlockingQueue获取任务来执行。

常见用途

参考:Executor框架的成员


线程任务

  1. public class Task implements Runnable {
  2. private final String name;
  3. public Task(String name) {
  4. this.name = name;
  5. }
  6. @Override
  7. public void run() {
  8. System.out.println(Thread.currentThread().getName() + " → " + name + " Start Time = " + new Date());
  9. processCommand();
  10. System.out.println(Thread.currentThread().getName() + " → " + name + " End Time = " + new Date());
  11. }
  12. private void processCommand() {
  13. try {
  14. Thread.sleep(3000);
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }

单线程线程池 newSingleThreadExecutor

  1. public class SingleThreadPool {
  2. public static void main(String args[]) throws InterruptedException, ExecutionException {
  3. System.out.println(Thread.currentThread().getName() + "线程: Start at: " + new Date());
  4. ExecutorService exec = Executors.newSingleThreadExecutor(); // 创建大小为1的固定线程池
  5. // 等价于 ExecutorService exec = Executors.newFixedThreadPool(1);
  6. for (int i = 1; i < 10; i++) {
  7. System.out.println("添加了第" + i + "个任务类");
  8. exec.execute(new Task(String.valueOf(i)));
  9. }
  10. exec.shutdown();
  11. System.out.println(Thread.currentThread().getName() + "线程: Finished all threads at:" + new Date() + ". isTerminated 判断次数 ");
  12. }
  13. }

执行结果分析















































































































执行结果
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个线程
主线程的执行与线程池里的线程分开,有可能主线程结束了,但是线程池还在运行
它能保证线程的先后顺序执行,并且能保证一条线程执行完成后才开启另一条新的线程

发表评论

表情:
评论列表 (有 0 条评论,151人围观)

还没有评论,来说两句吧...

相关阅读