一.学习经历
在高并发编程中,线程的创建和销毁对资源的消耗很大,为了降低资源消耗和更好的管理线程,有了线程池,阅读了不少资料后,从中恍惚理解了线程池大概的工作原理,并从学习过程中了解了阻塞队列和生产消费模式的大概原理。
但是看了不少的博客发现文字很多也难于理解,对一个知识点也是有不同的说法难于理解,而且在看的过程中老是遇到自己理解的不了的某个知识点或没学过的知识,又得去查找这个只是知识点,然后回过头来再看这块知识,很是难搞,于是乎我就画一个将自己理解的东西和学到的东西总结出来,这样可以帮助到同志们先将原理了解,至于如何实现那个步骤的知识点就看同志们的求知欲了,可以查看源码(我看源码的时候是从清醒到懵的状态,而且越debug越多)或者另行查看其它博主的文章(都很不错QWQ),接下来看图(总结不到或者总结有问题的希望同志们理解,画图不易)
1.线程和线程池
2.创建过程
二.常用创建过程
刚开始学习的时候,遇到了好几个创建线程池的方式,有单线程创建方式,固定大小线程池创建方式,自适应大小创建模式和延时任务创建方式,这4种创建方式。
- 对于单线程创建方式没有指定大小,
ExecutorService executorService = Executors.newSingleThreadExecutor();
- 固定大小线程池的创建
ExecutorService threadPool = Executors.newFixedThreadPool(n); //创建一个核心线程数和最大线程数都为n的线程池
- 自适应大小线程池的创建
ExecutorService executorService = Executors.newCachedThreadPool(); //创建一个核心数量为0,最大数量为Integer.MAX_VALUE的线程池
- 延时任务线程池的创建
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(8);
就客观来说,自适应大小线程池创建的是一个核心线程数为0的线程池,就意味着在空闲的时候(超时处理之后)线程池中的线程数是0,那就说明就没有可复用的,用完的线程如果不及时在超时范围内尽快使用就会立即销毁,这么一来不是本末倒置了嘛,本来是为了降低对资源的消耗,你这一进一出又给干没了,所以听起来是自适应的线程池,只是最大数量很大,对于对核心线程的处理几乎没有,这也意味着在真正使用中很少使用自适应大小线程池。
对于固定大小的线程池的创建最好让其大小等于电脑内核数,并行执行的效率高。