经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
java线程池实现多任务并发执行
来源:cnblogs  作者:$YX$  时间:2024/2/2 9:09:31  对本文有异议

Java线程池实现多任务并发执行

1?? 创建一些任务来落地多任务并发执行

每一个数组里面的数据可以看成任务,或者是需要并发的业务接口,
数组与数组之间,可以看作为他们之间有血缘关系,简单来说就是:
taskJksj里面的10个任务执行完之后,才可以执行taskJxdx里面的4个任务,执行完taskJxdx之后,才可以执行taskNbzz里面的2个任务

 

2?? 创建线程池

要将taskJksj、taskJxdx、taskNbzz这几个数组中里面定义的任务通过线程池并发执行

 

3?? ThreadPoolExecutor源码分析以及为什么不用newFixedThreadPool()和newCachedThreadPool()

1.首先为什么不用newFixedThreadPool()和newCachedThreadPool()

 

点进去查看这两个方法的源码

 

2.为什么用ThreadPoolExecutor创建
通过上面两个例子就能看到,这俩方法很不靠谱,如果你不明白他的原理,看到项目上以前创建线程的代码就是这样的,你想都不想就copy过来,那后面绝对就是在给自己挖坑;
通过发现这俩方法,他们都是return new ThreadPoolExecutor(),所以真正的大佬其实是ThreadPoolExecutor,他俩只是调用了ThreadPoolExecutor而已。

 

  • 核心线程数:初始定义的线程数量,是绝对会开启的固定的线程数量
  • 最大线程数:当前线程池支持的最大线程数量,如果超过了这个数量那么肯定就报错了
  • 阻塞队列   :当前进来线程池的线程大于核心线程数且小于最大线程数,那么就把当前线程池的线程-核心线程数的线程放在阻塞队列里,让他等着假如核心线程数 2 个,最大线程数5个,阻塞队列长度  3,当前进来了4个线程,那么就将 4 - 2 = 2 个线程放在阻塞队列里面,让他先等待
  • 默认工厂  :当前进来线程池的线程大于最大线程数且小于(最大线程数+阻塞队列长度),那么就需要开放剩下的三个线程通道,让另外的3个线程通道进行工作,核心线程数 2 个,最大线程数5个,    阻塞队列长度3,当前进来了8个,可以看到进来了8个线程,已经满足了最大线程和阻塞队列长度之和了,简单理解就是现在进来的线程把目前这个线程池所有能利用的空间都占满了,只有 2个线程工作不够,需要把另外的3个(5 - 2)赶快放开让他们也工作,这个打开另外三个线程的这个工作就需要工厂来做,让工厂把这三个线程打开
  • 拒绝策略 :当进入线程池的线程过多,远远超过了最大线程数+阻塞队列,那么就需要拒绝这些即将要进入线程池的线程。
  • 等待时间:在等待时间段中,当线程池里面的线程都执行的差不多了,又回到了"进来线程池的线程大于核心线程数且小于最大线程数"时,就没有必要把5个线程通道全部打开,浪费资源,所以就把其    他的三个线程关掉,留2个核心的就行  
  • 等待时间单位:单位,时分秒

4?? 执行任务

 

为三个任务编写对应的执行多线程方法,写法都是一样的,重复copy即可,最后执行的效果就是

 

 

  1. import java.util.concurrent.*;
  2. /**
  3. * @Author : YuanXin
  4. * @create 2024/2/1 11:11
  5. * @Description :
  6. */
  7. public class Main {
  8. public static void main(String[] args) {
  9. taskListImpl taskList = new taskListImpl();
  10. String taskJksj = taskList.poolExecutorJksj();
  11. String taskJxdx = null;
  12. if (taskJksj.equals("taskJksjSuccess")) {
  13. taskJxdx = taskList.poolExecutorJxdx();
  14. }
  15. if (taskJxdx.equals("taskJxdxSuccess")) {
  16. taskList.poolExecutorNbzz();
  17. }
  18. }
  19. }
  20. class taskListImpl {
  21. // 创建一些任务
  22. int[] taskJksj = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
  23. int[] taskJxdx = new int[]{15, 16, 17, 18};
  24. int[] taskNbzz = new int[]{101, 102};
  25. public String poolExecutorJksj() {
  26. ThreadPoolExecutor pool =
  27. new ThreadPoolExecutor(
  28. 3,
  29. 10,
  30. 3,
  31. TimeUnit.SECONDS,
  32. new LinkedBlockingDeque<>(5),
  33. Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()
  34. );
  35. // ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
  36. // ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
  37.  
  38. try {
  39. for (int i = 0; i < taskJksj.length; i++) {
  40. int num = i;
  41. pool.execute(() -> {
  42. taskJksjPool(num);
  43. });
  44. }
  45. } catch (Exception e) {
  46. throw new RuntimeException(e);
  47. } finally {
  48. pool.shutdown();
  49. }
  50. return "taskJksjSuccess";
  51. }
  52. public void taskJksjPool(int num) {
  53. System.out.println(Thread.currentThread().getName() + " " + taskJksj[num]);
  54. }
  55. public String poolExecutorJxdx() {
  56. ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 10, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(5), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
  57. try {
  58. for (int i = 0; i < taskJxdx.length; i++) {
  59. int num = i;
  60. pool.execute(() -> {
  61. taskJxdxPool(num);
  62. });
  63. }
  64. } catch (Exception e) {
  65. throw new RuntimeException(e);
  66. } finally {
  67. pool.shutdown();
  68. }
  69. return "taskJxdxSuccess";
  70. }
  71. public void taskJxdxPool(int num) {
  72. System.out.println(Thread.currentThread().getName() + " " + taskJxdx[num]);
  73. }
  74. public String poolExecutorNbzz() {
  75. ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 10, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(5), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
  76. try {
  77. for (int i = 0; i < taskNbzz.length; i++) {
  78. int num = i;
  79. pool.execute(() -> {
  80. taskNbzzPool(num);
  81. });
  82. }
  83. } catch (Exception e) {
  84. throw new RuntimeException(e);
  85. } finally {
  86. pool.shutdown();
  87. }
  88. return "taskNbzzSuccess";
  89. }
  90. public void taskNbzzPool(int num) {
  91. System.out.println(Thread.currentThread().getName() + " " + taskNbzz[num]);
  92. }
  93. }

 

原文链接:https://www.cnblogs.com/preciouslove/p/18001128

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号