关于线程池的两种创建方式

1.第一种方式Executors 工具类

固定大小线程池:newFixedThreadPool

单一线程池:newSingleThreadExecutor

可变线程池: newCachedThreadPool

调度线程池:newScheduledThreadPool

1.1单一线程池

该线程池只有一个线程,适用于需要按任务执行线程场景,保证任务的顺序性

//创建应该单一线程池
//        ExecutorService executorService = Executors.newSingleThreadExecutor();
//        executorService.submit(new Runnable() {
//            @Override
//            public void run() {
//                for (int i = 0; i < 10; i++) {
//                    System.out.println(Thread.currentThread().getName()+"+++++++++++++++++"+i);
//
//                }
//            }
//        });

1.2固定大小线程池

ExecutorService executorService = Executors.newFixedThreadPool(5);
//        //创建任务
//        for (int i = 0; i < 5; i++) {
//            executorService.submit(new Runnable() {
//                @Override
//                public void run() {
//                    for (int j = 0; j < 5; j++) {
//                        System.out.println(Thread.currentThread().getName() + " 任务执行 " + j);
//                    }
//                }
//            });
//        }

线程数量固定,任务提交后会一直处于新建状态,直到线程池关闭。适用于需要限制并发请求的场景,服务器后台处理任务,web服务器等。

1.3 可变线程池

//创建一个可以自动改变大小的线程池
//        ExecutorService executorService = Executors.newCachedThreadPool();
//        for (int i = 0; i < 10; i++) {
//            executorService.submit(()->{
//                    System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
//            });
//        }

特点:可以动态调整大小的线程池,根据任务数量自动增加线程数量。

使用场景:适用于需要大量处理短期任务的线程场景,如异步请求,服务器后台处理任务等。

1.4调度线程池:

 ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);//线程数量
//        for (int i = 0; i < 10; i++) {
//            scheduledExecutorService.schedule(()->{
//                System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~~~");
//            },5,TimeUnit.SECONDS);//5表示多长时间后执行任务 单位
//        }
            scheduledExecutorService.scheduleAtFixedRate(()->{
            },5,2,TimeUnit.SECONDS);

特点:可以定时或周期性执行任务

使用场景:适用于定时执行或周期性执行的线程场景,如定时数据备份,定时任务调度。

最后还需要关闭线程池,避免资源浪费

  //关闭线程池
//        executorService.shutdown();
//        //保证所有任务都执行完成
//        while (!executorService.isTerminated()) {
//        }

2.第二种方式:ThreadPoolExecutor

//核心参数的意思
/**
 * int corePoolSize,核心线程数的个数 2
 *  int maximumPoolSize,最大线程数量 5
 * long keepAliveTime, 非核心线程允许空闲的时间
 * TimeUnit unit, 时间的单位
 * BlockingQueue<Runnable> workQueue 堵塞队列中 3
 */

需要先创建一个堵塞队列的对象

ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue(5);//创建堵塞队列
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 5, 10, TimeUnit.SECONDS, arrayBlockingQueue);
for (int i = 0; i < 10; i++) {
    threadPoolExecutor.submit(()->{
        System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~~~~~");
    });
}

附加:

execute和submit方法区别

共同点:这两个方法都是用来执行线程任务的。

不同点:execute属于Excute类中的方法,而submit属于ExcutirService接口中的方法,而且submit可以执行Runable和Callable类型的任务,而execute只能执行Runable类型的任务,submit执行完任务有返回结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值