当前位置: 首页 > news >正文

多线程执行的3种场景示例代码

1.环境

 语言:java

 jdk版本:1.8

2.三种线程池场景使用

   2.1 固定线程数执行,每个线程只执行1次,最后全部执行完毕后再进入最终方法处理收尾

 public static void testEveryThreadFixedExecuteOne() {int threadNum = 4;ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(threadNum,threadNum, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());CyclicBarrier cyclicBarrier = new CyclicBarrier(threadNum, () -> {//必须保证线程池的线程数与该类的值一致CyclicBarrier(int parties, Runnable barrierAction)parties一致// 线程池线程执行cyclicBarrier.await()会减一并阻塞线程等待cyclicBarrier所有操作完为0则进入该方法。// 所有执行完毕,执行这里面操作。System.out.println("全部线程执行结束了,这里可以处理最后收尾的逻辑");});for (int curentPageNum = 1; curentPageNum <= threadNum; curentPageNum++) {int finalCurentPageNum = curentPageNum;threadPoolExecutor.execute(() -> {try {System.out.println("执行线程逻辑" + finalCurentPageNum);} catch (Exception exception) {exception.printStackTrace();} finally {try {cyclicBarrier.await();} catch (InterruptedException e) {throw new RuntimeException(e);} catch (BrokenBarrierException e) {throw new RuntimeException(e);}}});}//发送停止标志,线程全部执行完毕会直接关闭threadPoolExecutor.shutdown();}

   2.2 线程池的线程可被重复利用,直到所有任务都执行完成

public static void testThreadRepeatUse() {int threadNum = 4;int totalPageNum = 10;ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(threadNum,threadNum, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());for (int curentPageNum = 1; curentPageNum <= totalPageNum; curentPageNum++) {int finalCurentPageNum = curentPageNum;threadPoolExecutor.execute(() -> {System.out.println("执行" + finalCurentPageNum + " " + Thread.currentThread().getName());});}//发送停止标志,线程全部执行完毕会直接关闭threadPoolExecutor.shutdown();try {boolean awaitLoop = true;//阻塞判断do {awaitLoop = !threadPoolExecutor.awaitTermination(2, TimeUnit.SECONDS);} while (awaitLoop);} catch (Exception exception) {exception.printStackTrace();threadPoolExecutor.shutdownNow();}System.out.println("线程都执行结束了,可以执行后续操作");}

 2.3  线程池的每个线程只执行一件事,最终得到所有线程的执行结果

  

public static void testGetAllThreadResult() throws Exception {int threadNum = 2;int execNum = 2;ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(threadNum,threadNum, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());List<Callable<List<Map<String, String>>>> callableList = new ArrayList<>();final AtomicInteger atomicInteger = new AtomicInteger(0);for (int i = 0; i < execNum; i++) {callableList.add(new Callable<List<Map<String, String>>>() {@Overridepublic List<Map<String, String>> call() throws Exception {List<Map<String, String>> singleResultList = new ArrayList<>();int automicInt = atomicInteger.incrementAndGet();if (automicInt == 1) {System.out.println("我做第一件事,扫地");singleResultList = new ArrayList<>();LinkedHashMap<String, String> sweepMap = new LinkedHashMap<>();sweepMap.put("action", "sweep");singleResultList.add(sweepMap);} else if (automicInt == 2) {System.out.println("我做第二件事,擦玻璃");singleResultList = new ArrayList<>();LinkedHashMap<String, String> wipeMap = new LinkedHashMap<>();wipeMap.put("action", "wipe glass");singleResultList.add(wipeMap);}return singleResultList;}});}//这里会去调用执行并等待线程池内的所有任务执行完毕List<Future<List<Map<String, String>>>> futureList = threadPoolExecutor.invokeAll(callableList,7, TimeUnit.SECONDS);//全部执行完毕获取每个线程的返回值List<Map<String,String>> resultList =new ArrayList<>();for (int i = 0; i <futureList.size() ; i++) {resultList.addAll(futureList.get(i).get());}System.out.println(String.format("全部执行完毕,结果集:%s",resultList));threadPoolExecutor.shutdown();}

 以上就是3种场景使用,可进行参考。


http://www.mrgr.cn/news/794.html

相关文章:

  • 如何在桌面同时展示多个窗口
  • 『大模型笔记』从零开始构建AI智能体!
  • 网络协议 十一 ARP,RARP,icmp,websocket,webservice,HTTPDNS,FTP,邮件相关的协议, SMTP,POP,IMAP
  • 基于微信小程序的高校校园信息整合平台的设计与实现
  • TypeError: Cannot read properties of undefined (reading ‘scrollIntoView‘)(已解决)
  • YOLOv8跑通POSE分类--姿态检测coco8-pos数据集
  • android 12.0SystemUI 状态栏下拉快捷添加截图快捷开关
  • 06_Linux中如何让程序重启后自动启动
  • 力扣--两数之和
  • PHP获取和操作配置文件php.ini的几个函数介绍
  • 一文带你深度了解“模糊控制器”的实现原理及C语言实现代码
  • 白骑士的C#教学实战项目篇 4.3 Web开发
  • 高可用集群keepalived的应用以及部署
  • 隧道定位导航技术主要依赖于哪些原理或技术
  • 6路220V交流电通断监测采集,继电器报警输出模块DAM-3020R
  • 【CSS】数字英文css没有转换成...换行点、没有换行、拆分的问题(非常常见的需求)
  • redis字符串若干记录
  • CPU缓存一致性机制详解
  • css如何使一个盒子水平垂直居中
  • 鸿蒙关于可以实现滚动效果的容器组件的相关知识