【并发编程】- Executors 创建单一线程池

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

使用newSingleThreadExecutor()方法创建单一线程池

使用newSingleThreadExecutor()方法可以创建单一线程池,单一线程池可以实现以队列的方式执行具体任务。

实现代码如下:

public class TheRunnable implements Runnable {

    private String username;

    public TheRunnable(String username){
        super();
        this.username=username;
    }


    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() +" username= "+username+"  开始时间:"+System.currentTimeMillis());
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() +" username= "+username+"  结束时间:"+System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
复制代码

运行类代码如下:

public class SingleThreadExecutorRun {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 3 ; i++) {
            executorService.execute(new TheRunnable(String.valueOf(i+1)));
        }
    }
}
复制代码

运行结果如下:

pool-1-thread-1 username= 1  开始时间:1653900159583
pool-1-thread-1 username= 1  结束时间:1653900161592
pool-1-thread-1 username= 2  开始时间:1653900161594
pool-1-thread-1 username= 2  结束时间:1653900163608
pool-1-thread-1 username= 3  开始时间:1653900163608
pool-1-thread-1 username= 3  结束时间:1653900165613
复制代码

从运行结果看出单一线程池最多只有1个线程在运行。

ThreadPoolExecutor使用

​ ThreadPoolExecutor非常方便地创建线程池对象,而不需要大量new实例化Thread相关的代码。

​ 使用Executors工厂类的newXXXThreadExecutor()方法可以快速创建线程池,但创建的细节需要查看源码。

使用newSingleThreadExecutor()方法时内部是实例化了一个ThreadPoolExecutor类的实例,源码如下:

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

ThreadPoolExecutor最常使用的构造方法是

ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue)
复制代码

参数说明:

  • corePoolSize:池中所保存的线程数,包括空闲线程,就是核心线程数。

  • maximumPoolSize:池中允许的最大线程数。

  • KeepAliveTime:当线程数量大于corePoolSize值时,在没有超过指定的时间内是不从线程池中将空闲线程删除的,如果超过此时间单位,则删除。

  • unit:keepAliveTime参数的时间单位。

  • workQueue:执行前用于保持任务的队列,此队列保持由execute方法提交的Runnable任务。

猜你喜欢

转载自juejin.im/post/7104482364729851918
今日推荐