单线程线程池 newSingleThreadExecutor

[Q&A] newSingleThreadExecutor定义

public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1,
        						1,
                                0L, 
                                TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>()));
}

在这里插入图片描述

[Q&A] FixedThreadPoolexecute()方法的运行示意图

1)如果当前运行的线程数少于corePoolSize,则创建一个新线程来执行任务。
2)当前线程池中有一个运行的线程,将任务加入LinkedBlockingQueue3)线程执行完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个线程
主线程的执行与线程池里的线程分开,有可能主线程结束了,但是线程池还在运行
它能保证线程的先后顺序执行,并且能保证一条线程执行完成后才开启另一条新的线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值