优雅的线程池


前言

在开发多线程应用的时候,通常会使用线程池来管理线程的运行。但线程池对象并不了解每个线程的业务逻辑代码,线程池很难知道池中的每个线程何时结束。甚至在关闭线程池后,还会等待池内的线程执行完,而强行关闭一直是文档规范所不推崇的。另外,如怎样让在池中排队(还未执行)的线程不要执行,也是一个麻烦的问题。


基本约定

1. 这里所指的线程池是指单线程池,也就是该线程池内任意时刻只会有一个线程在运行。如果需要扩展到多线程,则应建立多个单线程池来实现。

2. 线程池中,可能有正在运行的线程,有正在排队的线程,也可能线程池中一个线程都没有。

3. 所谓线程结束是指,线程主函数返回。如果线程内有开新的线程,那么新线程的生命周期应由线程开发者自行管理。


如何知道线程池中的某线程已结束

只需要在池中加入线程后,再加入一个线程池管理者自己的线程M,这个M线程一旦被执行,就可以知道,之前的线程已结束。

注意,加入线程时,最好要做同步操作。


如何让池中还未执行的线程不要执行

封装线程池类,让线程池的使用者只能通过特定函数添加线程。在这些特定函数里,实际上把线程放到自己的队列Q中,而不是直接放入线程池中。确保线程池中的线程运行结束(参见上节)后,再从队列Q中获取下一个需运行的线程放入池中执行。

只需要提供函数清空队列Q,就可以让队列中的线程不再得到执行。


上述线程池同时运行的线程只有一个,怎么样提供多线程能力

只需要多开设几个上述线程池就可以了,当然需要撰写代码,将队列Q中线程均匀分配到各个线程池中。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【JAVA 线程】 线程 进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者...
    Rtia阅读 2,777评论 2 20
  • 前段时间遇到这样一个问题,有人问微信朋友圈的上传图片的功能怎么做才能让用户的等待时间较短,比如说一下上传9张图片,...
    加油码农阅读 1,215评论 0 2
  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 2,820评论 1 17
  • 在一个靠张扬个性,释放自我博眼球的年代,懂得自我营销的人才能站在主场。内向真的不是什么好东西,尤其你还不主动,注定...
    蟹壳同学阅读 2,191评论 3 6
  • 微商好不好?这问题咋回答呢? 为了回答《微商好不好?》这个问题,我来给大家讲个小故事。 01 阳光明媚,气温三十八...
    Tiger_老貓阅读 325评论 0 0