创建的线程池有哪几种方式

Developmer 发布于 02/15 07:06
阅读 309
收藏 0

创建的线程池有哪几种方式

加载中
0
晴l天l雨
晴l天l雨

Java中创建线程池有以下几种方式:

  • Executors.newFixedThreadPool(int n):创建一个固定大小的线程池,其中池中有n个线程。

ExecutorService executor = Executors.newFixedThreadPool(n);

  • Executors.newSingleThreadExecutor():创建一个只有一个线程的线程池,池中的任务将按顺序执行。

ExecutorService executor = Executors.newSingleThreadExecutor();

  • Executors.newCachedThreadPool():创建一个线程池,可以根据需要自动添加线程,没有固定大小。

ExecutorService executor = Executors.newCachedThreadPool();

  • Executors.newScheduledThreadPool(int corePoolSize):创建一个线程池,可定时或延时执行任务。

ScheduledExecutorService executor = Executors.newScheduledThreadPool(corePoolSize);

以上都是通过工厂方法 Executors 创建的,也可以通过 ThreadPoolExecutor 类直接创建自定义的线程池。ThreadPoolExecutor 类的构造方法可以接受很多参数,包括线程池的核心线程数、最大线程数、任务队列、线程存活时间等等,具有更灵活的配置选项。

  • ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue):使用 ThreadPoolExecutor 构造函数创建线程池,可以自定义线程池的核心线程数、最大线程数、线程存活时间以及任务队列类型和大小。

其中,corePoolSize 是指核心线程池大小,maximumPoolSize 是指线程池最大大小,keepAliveTime 是指线程空闲后的存活时间,unit 是指时间单位,workQueue 是指任务队列。任务队列可以选择使用 ArrayBlockingQueue、LinkedBlockingQueue 或 SynchronousQueue 等类型。

BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);

  • ForkJoinPool:用于执行 ForkJoinTask 的线程池,ForkJoinTask 是 Java 7 中的新功能,用于支持基于分治的并行计算。

ForkJoinPool executor = new ForkJoinPool();

  • WorkStealingPool:Java 8 中新增的线程池类型,使用 ForkJoinPool 实现,其核心特点是工作窃取(Work Stealing)。该线程池可以让空闲线程窃取其他线程的任务执行,从而提高线程利用率和整体的执行效率。

Executor executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                60L, TimeUnit.SECONDS,
                new SynchronousQueue<Runnable>());

CachedThreadPoolExecutor:这是 ThreadPoolExecutor 的一种定制化实现,使用 SynchronousQueue 作为任务队列。线程池的核心线程数为0,最大线程数为 Integer.MAX_VALUE,即线程数量可以无限制增加。当一个线程空闲时,它会尝试去执行队列中等待的任务。如果没有等待的任务,它会保持空闲状态等待新的任务加入。如果等待的任务数量超过了 SynchronousQueue 的容量,就会新建线程来处理任务。

  • SingleThreadExecutor:这个线程池只有一个线程,用于顺序执行任务。如果这个线程因为异常退出,那么会有一个新的线程来取代它。任务被存放在 LinkedBlockingQueue 中,所以它能够存放无限数量的任务。

ExecutorService executor = Executors.newSingleThreadExecutor();

  • FixedThreadPoolExecutor:这个线程池的线程数量是固定的。当一个线程由于异常而结束时,线程池会自动启动一个新的线程来取代它。任务被存放在 LinkedBlockingQueue 中,所以它能够存放无限数量的任务。

ExecutorService executor = Executors.newFixedThreadPool(n);
需要注意的是,这些线程池实现返回的都是一个 ExecutorService 对象或其子类,需要使用 execute 方法提交任务并执行。例如:

executor.execute(new Runnable(){
    @Override
    public void run() {
        // 执行具体的任务
    }
});

 

pyboy58
pyboy58
666
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部