java基础之线程池


参考博客地址:

https://blog.csdn.net/bjweimengshu/article/details/118004655?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164326380716780274139366%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164326380716780274139366&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-3-118004655.nonecase&utm_term=%E7%BA%BF%E7%A8%8B%E6%B1%A0&spm=1018.2226.3001.4450

1、为什么需要线程池

1、传统的使用方式:new Thread(()->{
    // doSomething.........
})
这种方式可以将其设置成一个工具类来进行定义使用,但是有一个缺点就是每次都会来创建一个新的线程来执行;如果有大量的线程过来,如何来进行处理?

优化思想一:将任务丢掉一个队列中来,然后创建一个线程,当一个线程执行完成之后,从队列中来取下一个线程来进行执行;
          worker线程,不断的从task任务队列中来取任务;
          好处是什么?控制了线程数量,队列中的任务的提交和执行;
          重要的一点是:解决了线程开销问题,每次线程的创建和销毁,这个可以导致线程重复利用......

          这种情况下会存在如果任务过多,也就是task队列中的任务比较多的时候,会导致线程运行不过来,直接效果就是得到的结果没有那么及时;
          那么对应的解决方式应该是增添worker线程数量,但是具体数量应该交给使用者来进行决定,那么这个应该将之称之为核心线程数量

优化思想二:
        初始化的时候,将所以核心线程数运行起来(但是任务少的时候,如何来进行决定,是个问题)
        worker就从任务队列中将任务拿出来进行运行,死循环;
        execute方法仍然是从队列中将任务取出来,但是队列满了之后,直接将再次来的任务给拒绝掉(这个不合适,不应该这么来进行操作)

        question:这样子来进行操作,肯定是存在着很大的问题的:
                1、核心线程worker运行起来之后,没有对应的任务跑起来,可能在低谷期间只有一两个线程在运行,其他的线程在运行阶段只会浪费线程运行时间;
                也就是说,这里应该调整成按需来加载worker线程;直接到来的任务将worker全部占据之后,然后才将线程放置到任务队列中去

                2、增加拒绝策略,当任务队列满了之后,才会将新的任务给拒绝掉;接口写好了,可以根据自己的需求来自己定义;
                3、增加线程工厂,用来创建线程的(核心线程数目)

优化思想三:
         弹性思维:上面的线程池,在核心线程在执行的时候,任务队列也满了,只能够走拒绝策略,生活中存在着高峰期和低峰期,不可能手动的来对其进行改造,那么这里需要特别的注意

                  所以发生了新的线程数量,最大线程数目,当队列也满了,先不要执行拒绝策略,而是先走非核心线程数目来执行,非核心线程数量来执行突发情况的线程数量

                  这样子来做也是一种可取的方式,当正常情况下,那么这些非核心线程数量肯定也是不需要留着的,需要将其释放掉即可

                  所以这里应该有个过期时间,设置非核心线程在多久没有执行任务之后,将设置设置成死亡即可

所以按照这种设计思想来设计属于自己的线程。