线程池7种创建方式

本文详细介绍了Java线程池的7种创建方式,包括固定个数线程池、带缓存线程池、定时任务线程池等,并讨论了线程池的优点,如避免频繁创建和销毁线程,以及线程池的执行流程、拒绝策略等。文中还强调了阿里巴巴开发手册中关于使用线程池的要求,以避免资源浪费和过度切换问题。
摘要由CSDN通过智能技术生成

一. 线程的缺点

1:线程的创建需要开辟三个内存资源:本地方法栈,虚拟机栈,程序计数器等线程私有变量的内存,同时销毁的时候需要销毁以上三个区域的内存,频繁的创建和消耗会带来一定的性能开销。

2:在任务量远大于线程可以处理的任务量的时候, 使用线程不能很好的管理任务和友好的拒绝任务。

3:阿里开发手册要求:
[强制]线程资源必须通过线程池提供,不允许在应用中自行显式创建线程
说明:线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。
如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换” 的问题。

二 .线程池

1.定义:使用池化技术来管理和使用线程的技术

2.线程池的优点:

(1)可以避免频繁的创建和消耗线程
(2)可以更好地管理线程的个数和资源的个数
(3)拥有更多功能,比如线程池可以进行定时任务的执行。
(4)线程池可以更友好的拒绝不能处理的任务

3.线程池的创建方式(共7种):

(1)创建固定个数的线程池(任务数趋向无限大,可能会造成OOM,谨慎使用)

public class ThreadPoolDemo1 {
   
    public static void main(String[] args) {
   
        //创建一个固定个数的线程池
       ExecutorService service =  Executors.newFixedThreadPool(10);//最大为10
        for (int i = 0; i < 2; i++) {
   
        
                    //执行任务
            service.execute(new Runnable() {
   
                @Override
                public void run() {
   
                    System.out.println("线程名:" + Thread.currentThread().getName());

                }
            })

问题:创建了10个线程来执行2个任务,那当前程序创建了几个线程?
: 创建了2个线程

(2)创建带缓存的线程池(根据任务数量生成对应的线程数)

public class ThreadPoolDemo3 {
   
    public static void main(String[] args) {
   
     //创建带缓存的线程池
      ExecutorService service =  Executors.newCachedThreadPool();
      //执行十个任务
        for (int i = 0; i < 10 ; i++) {
   
            service.execute(new Runnable() {
   
                @Override
                public void run() {
   
                    System.out.println("线程名:"+Thread.currentThread().getName());
                }
            });
        }
    }
}

适用场景:有大量短期任务时newCachedThreadPool() 根据当前的任务创建一定数量的线程池

(3)创建可以执行定时任务的线程池

【1】 scheduleWithFixedDelay的使用
public class ThreadPoolDemo4 {
   
    public static void main(String[] args) {
   
        //创建可以执行定时任务的线程池
       ScheduledExecutorService service =  Executors.newScheduledThreadPool(10);
       //执行任务
        service.scheduleWithFixedDelay(new Runnable() {
   
            @Override
            public void run() {
   
                System.out.println("执行任务:"+new Date());
            }
        },1,3, TimeUnit.SECONDS);
    }
}

参数1:线程池的任务
参数2:定时任务延迟多长时间开始执行
参数3:定时任务执行频率
参数4:配合参数2和参数3使用的时间单位

【 2】 schedule使用
public class ThreadPoolDemo6 {
   
    public static void main(String[] args) {
   
        ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
        System.out.println("执行任务之前:"+new Date());
        //执行任务
        service.schedule(new Runnable() {
   
            @Override
            public void run() {
   
                System.out.println("执行任务:"+new Date());
            }
        },3, TimeUnit.SECONDS);
    }
}

以上两者区别
(1)schedule没有延迟执行的时间设置
(2)schedule定时任务只能执行一次

【3】scheduleAtFixedRate使用
public class ThreadPoolDemo7 {
   
    public static void main
线程池创建方式有7,其中6是通过`Executors`创建的,1是通过`ThreadPoolExecutor`创建的。 以下是线程池创建方式的介绍和示例代码: 1. `Executors.newFixedThreadPool`:创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待。 ```java ExecutorService executor = Executors.newFixedThreadPool(5); ``` 2. `Executors.newCachedThreadPool`:创建一个可缓存的线程池线程池的大小会根据需要进行自动扩展,但是在线程池中的线程空闲超过60秒后会被回收。 ```java ExecutorService executor = Executors.newCachedThreadPool(); ``` 3. `Executors.newSingleThreadExecutor`:创建一个单线程的线程池,保证所有任务按照指定顺序执行。 ```java ExecutorService executor = Executors.newSingleThreadExecutor(); ``` 4. `Executors.newScheduledThreadPool`:创建一个固定大小的线程池,可以延迟或定时执行任务。 ```java ScheduledExecutorService executor = Executors.newScheduledThreadPool(3); ``` 5. `Executors.newWorkStealingPool`:创建一个工作窃取线程池,每个线程都有自己的任务队列,当自己的任务队列为空时,会从其他线程的任务队列中窃取任务执行。 ```java ExecutorService executor = Executors.newWorkStealingPool(); ``` 6. `Executors.unconfigurableExecutorService`:创建一个不可配置的线程池,即无法修改线程池的配置参数。 ```java ExecutorService executor = Executors.unconfigurableExecutorService(executor); ``` 7. `ThreadPoolExecutor`:通过自定义参数创建线程池,可以灵活地配置线程池的大小、任务队列、拒绝策略等。 ```java ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue, handler); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值