ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-02-23 12:03:39  阅读:179  来源: 互联网

标签:Executors 创建 void 哪几种 线程 private static ExecutorService


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

  1. 线程创建方式有哪几种?
  2. 什么是定长线程池?
  3. 什么是可缓存线程池?
//定长线程池
//解释:每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程数量不在变化,当线程发生错误结束时,线程池会补充一个新的线程
static ExecutorService fixedPool = Executors.newFixedThreadPool(3);
//定长可执行周期任务的线程池
static ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(3);
//缓存线程池
//解释:如果线程池的容量超过了任务数,会自动回收空闲线程,任务增加时可以自动添加新线程,线程池的容量不限制
static ExecutorService cachedPool = Executors.newCachedThreadPool();
//单例线程池
//解释:线程异常结束,会创建一个新的线程,能确保任务按提交顺序执行
static ExecutorService singlePool = Executors.newSingleThreadExecutor();
//单例可执行周期任务的线程池
static ScheduledExecutorService singleScheduledPool = Executors.newSingleThreadScheduledExecutor();
//窃取线程池
//解释:不保证执行顺序,适合任务耗时差异较大
static ExecutorService workPool = Executors.newWorkStealingPool();

线程池创建方式有以上六种,下面来看看实例代码

package cn.zwolf.app.controller;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ThreadPoolTest {
    
    //定长线程池
    static ExecutorService fixedPool  = Executors.newFixedThreadPool(3);
    //定长可执行周期任务的线程池
    static ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(3);
    //缓存线程池
    static ExecutorService cachedPool  = Executors.newCachedThreadPool();
    //单例线程池
    static ExecutorService singlePool = Executors.newSingleThreadExecutor();
    //单例可执行周期任务的线程池
    static ScheduledExecutorService singleScheduledPool = Executors.newSingleThreadScheduledExecutor();
    //窃取线程池
    static ExecutorService workPool = Executors.newWorkStealingPool();

    public static void main(String[] args) {
        //定长线程池
        fixedThreadPool();
        //定长可执行周期任务的线程池
        scheduledThreadPool();
        //缓存线程池
        cachedThreadPool();
        //单例线程池
        singleThreadPool();
        //单例可执行周期任务的线程池
        singlnScheduledThreadPool();
        //窃取线程池
        workThreadPool();
    }
    
	//测试定长线程池,线程池的容量为3,提交6个任务,根据打印结果可以看出先执行前3个任务,3个任务结束后在执行后面的任务
    private static void fixedThreadPool() {
        threadPool(fixedPool );
        fixedPool .shutdown();
    }

    private static void scheduledThreadPool() {
        sThreadPool(scheduledPool);
        scheduledPool.shutdown();
    }

    private static void cachedThreadPool() {
        threadPool(cachedPool);
        cachedPool .shutdown();
    }

    private static void singleThreadPool() {
        threadPool(singlePool);
        singlePool .shutdown();
    }

    private static void singlnScheduledThreadPool() {
        sThreadPool(singleScheduledPool);
        singleScheduledPool.shutdown();
    }

    private static void workThreadPool() {
        threadPool(workPool);
        workPool .shutdown();
    }

    private static void threadPool(ExecutorService e) {
        for (int i = 0; i < 6; i++) {
            final int index = i;
            e.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(3000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " index : " + index);
                }
            });
        }

        try {
            Thread.sleep(4000);
        } catch (Exception es) {
            es.printStackTrace();
        }
        System.out.println("4秒后~");
    }

    private static void sThreadPool(ScheduledExecutorService e) {
        for (int i = 0; i < 10; i++) {
            final int index = i;
            //scheduleWithFixedDelay =》 固定的延迟时间执行任务; 
            //scheduleAtFixedRate =》 固定的频率执行任务;
            e.scheduleWithFixedDelay(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + " index : " + index);
                }
            },0,3, TimeUnit.SECONDS);
        }
        try {
            Thread.sleep(4000);
        } catch (Exception es) {
            es.printStackTrace();
        }
        System.out.println("4秒后~");
    }
}

看完这篇文章和实践操作之后,对上面的问答题是否已经有了清楚的了解了和认识了呢?

标签:Executors,创建,void,哪几种,线程,private,static,ExecutorService
来源: https://blog.csdn.net/ZhaoCyChina/article/details/123085941

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有