多线程-常见四种类型线程池总结

线程池

线程池的概念: 在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作. Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务的线程相当于消费者,并用Runnable、Callable来表示任务,Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。

1.带有缓冲区的线程池

newCachedThreadPool(): 创建一个带有缓冲区的线程池,可根据需要创建新线程,在执行线程任务时先检测线程池是否存在可用线程,如果存在则直接使用,如果不存在则创建新线程然后使用。如果线程池中的线程空闲时间到达60秒后自动回收该线程。适于执行短期线程任务

public class CachedPool {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //获得一个带有缓冲区的线程池
        ExecutorService executorService  = Executors.newCachedThreadPool();
        //创建一个基于Callable的线程池
        Pool2 pool2 = new Pool2();
        for (int i=0;i<10;i++) {

          Future<Object> future =  executorService.submit(pool2); //future表示异步计算的结果
            //String str = (String) future.get();
           // System.out.println(str);
        }
        executorService.shutdown();//关闭线程池
        
        
        
        
        
        
        
        
        
        
        
       


    }
}

String str = (String) future.get();
表示通过Futrue这个类获得返回值,当调用get方法时,线程将会进入阻塞状态被挂起,所以必须设计这个代码的执行,本文此处将其注释点,不是本章节的重点

2.固定数量的缓冲池

newFixedThreadPool(): 创建一个固定数量的线程池,线程池中的线程数量固定,如果没有空闲线程则新任务处于等待状态,空闲线程不会被回收,适用于执行长期线程任务

public class FixedThreadPool {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);//固定数量为3,核心线程数

        Pool2 pool2 =new Pool2();
        for(int i=0;i<10;i++){
            Future future =executorService.submit(pool2);
        }
        executorService.shutdown();//一共有10个线程数,核心的有三个也是最大容量,那么剩下的7个被放在等待队列中,等到其中的一个线程执行完毕之后,等待队列的线程开始执行
    }
}

3.定时的线程池

newScheduledThreadPool(): 创建一个调度型线程池,可以执行定时任务

public class TimePool {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
        /***
         *  启动定时任务
         *  参数1:线程任务
         *  参数2:延迟时间 程序多少时间后执行
         *  参数3:间隔时间
         *  参数4:时间单位
         */
        scheduledExecutorService.scheduleAtFixedRate(new Pool1(),0,1000, TimeUnit.MILLISECONDS);
//定时器:Timer,TimerTask
        scheduledExecutorService.shutdown();
    }
}

4.自定义线程池

new ThreadPoolExecutor: 创建一个自定义线程池

public class DIVPool {

/***
 * 创建自定义线程池对象
 * 参数1:核心线程数(核心线程不会被回收)
 * 参数2:最大线程数
 * 参数3:非核心线程的最大空闲时间,空闲时间到达后自动回收线程,时间单位由第4个参数指定
 * 参数4:时间单位,
 * 参数5:等待队列
 **/



public static void main(String[] args) {
    ArrayBlockingQueue queue = new ArrayBlockingQueue(10);//创建线程等待队列
    ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,100, TimeUnit.MILLISECONDS,queue);
    Pool2 pool2 = new Pool2();
    for(int i=0;i<10;i++){
       executor.submit(pool2);  
    }
}
}

自定义线程池的等待队列: 当等待队列里边放不下才建立新的线程,当创建18个线程时候,核心线程数5个线程 等待队列容纳10线程 有三个为新建的线程一共执行8个线程,最多只能新建5个线程

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
观察者模式是一种常见的设计模式,用于实现对象之间的松散耦合。在C++线程池中,可以使用观察者模式来实现任务的调度和通知系统。通过观察者模式,可以将任务添加到任务队列中,并由线程池中的线程来执行这些任务。 在线程池中,可以创建一个任务接口类ITask作为观察者模式中的观察者,该接口类需要有一个纯虚函数Run来执行具体的任务。然后,可以创建具体的任务类myTask来继承ITask接口,并实现Run函数来定义具体的任务流程。通过这种方式,可以实现不同类型的任务,并将它们添加到线程池的任务队列中。 引用中提到的代码示例展示了如何使用观察者模式来实现线程池中的任务。通过创建ITask接口类和myTask任务类,并实现任务的具体流程,可以实现线程池中的任务调度和执行。 此外,引用中提到的代码地址可以查看更多关于线程池任务的实现细节和完整示例代码。 总结起来,观察者模式可以在C++线程池中用于实现任务的调度和通知系统,通过创建任务接口类和具体任务类,并使用虚函数来定义任务流程,可以实现线程池中不同类型任务的执行。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C++线程池任务实现(简洁版)](https://blog.csdn.net/PX1525813502/article/details/128009153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [设计模式之观察者模式,以C++为例。](https://blog.csdn.net/weixin_44120785/article/details/128941527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值