线程池的使用入门

2020-04-16  本文已影响0人  文景大大

在上一篇文章中,我们总结了三种创建线程的方式:《Java多线程基础——三种创建线程的方式》,然而在真实的开发中很少直接使用这些方式创建线程,更多地是使用线程池。

线程池是一种“池”技术,就像连接池一样,提前准备好特定数量的资源,所有任务都使用其中的资源运行,从而结局了线程频繁创建和销毁带来的资源损耗。同时,线程池还提供了线程的创建、运行、等待、关闭等操作,大大解放了开发人员的工作,简化了多线程使用的门槛。

一、入门实例

我们先来实际感受下使用线程池的例子,其中的某些参数不懂的可以先跳过,后面会详细介绍。

@Slf4j
public class FruitThread implements Runnable {
    private String fruitName;

    public FruitThread(String fruitName){
        this.fruitName = fruitName;
    }

    @Override
    public void run() {
        log.info("get fruit: {}", fruitName);
    }
}
public class ThreadPoolTest {
    public static void main(String[] args) {
        Runnable apple = new FruitThread("apple");
        Runnable orange = new FruitThread("orange");

        // 创建线程工厂,线程池中的线程都由该工厂创建
        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-pool-%d").build();
        // 创建一个线程池,参数先不用管,后续详细介绍
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L,
                TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
        // 将任务交给线程池去执行
        threadPoolExecutor.execute(apple);
        threadPoolExecutor.execute(orange);
        // 关闭线程池
        threadPoolExecutor.shutdown();
    }
}

我们可以看到,与先前自己创建线程,自己负责执行不同,使用线程池的时候,我们不用管理线程的创建和执行,非常地方便。

二、线程池参数

我们看下创建线程池时的构造函数:

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

三、常用线程池

除了使用上面new新的线程池对象来创建线程池之外,还可以使用如下四种方式来创建线程池。

根据阿里巴巴的Java代码开发规约,我们在实际开发中,尽量使用new方式自己创建线程池,而不是使用Executors来创建以上的四种线程池,理由是:

new的方式,更容易让开发者明确线程池的运行规则,比如一眼就能直到线程池的各项参数,更容易思考和规避资源消耗问题。

四、线程池的监控

五、关闭线程池

上一篇 下一篇

猜你喜欢

热点阅读