Master-Worker工具使用文档

举报
西魏陶渊明 发表于 2022/09/25 03:12:10 2022/09/25
【摘要】 本案例测试Master-Worker并发设计模式,网上关于该模式,都大差不差,本案例使用线程池的方式,重新实现,并进行测试对比。笔者希望进行优化,并作为工具使用,技术水平有限,请多多指教,提出不同意见,共同进步。 建议Clone代码,学习GIT仓库地址 目录 使用方法测试对比 测试ThreadMap result:216...

本案例测试Master-Worker并发设计模式,网上关于该模式,都大差不差,本案例使用线程池的方式,重新实现,并进行测试对比。笔者希望进行优化,并作为工具使用,技术水平有限,请多多指教,提出不同意见,共同进步。

建议Clone代码,学习
GIT仓库地址

目录

  • 使用方法
  • 测试对比

  
  1. 测试ThreadMap result:216474736
  2. 测试ExecutorService result:216474736
  3. StopWatch '': running time (millis) = 652
  4. -----------------------------------------
  5. ms % Task name
  6. -----------------------------------------
  7. 00432 066% 测试ThreadMap
  8. 00220 034% 测试ExecutorService

使用方法

SmileWorkerHandler

实现 SmileWorkerHandler 类,为每个任务写处理方法


  
  1. public interface SmileWorkerHandler<T> {
  2. default T handler(T input) {
  3. return input;
  4. }
  5. }

SmileMaster

该类任务主要用于任务分配,提供多种构造,运行自定义线程池和线程工厂


  
  1. /**
  2. * @param worker Worker进程逻辑
  3. * @param countWorker Worker进程数量
  4. */
  5. public SmileMaster(SmileWorker worker, int countWorker)
  6. /**
  7. * @param worker Worker进程逻辑
  8. * @param countWorker Worker进程数量
  9. * @param threadFactory 自定义线程工厂
  10. */
  11. public SmileMaster(SmileWorker worker, int countWorker, ThreadFactory threadFactory)
  12. /**
  13. * @param worker Worker进程逻辑
  14. * @param executor 线程池
  15. * 使用线程池来维护工作队列
  16. */
  17. public SmileMaster(SmileWorker worker, int countWorker, ExecutorService executor)

测试对比及使用代码

运行返回值就是本文开头的代码块,多余的不解释,直接撸代码,欢迎提出问题,共同解决,进步


  
  1. /**
  2. * @Package: flyer.worker.core
  3. * @Description: 测试版本
  4. * @author: liuxin
  5. * @date: 2017/9/14 下午5:15
  6. */
  7. public class SmileMasterTest {
  8. public static void main(String[] args) throws Exception {
  9. /**
  10. * 测试使用Map维护Thread
  11. */
  12. StopWatch watch = new StopWatch();
  13. watch.start("测试ThreadMap");
  14. Integer testthreadMapResult = testthreadMap(10,100000);
  15. System.out.println("测试ThreadMap result:"+testthreadMapResult);
  16. watch.stop();
  17. /**
  18. * 使用线程池维护现场
  19. */
  20. watch.start("测试ExecutorService");
  21. Integer testExecutorServiceResult = testExecutorService(10,100000);
  22. System.out.println("测试ExecutorService result:"+testExecutorServiceResult);
  23. watch.stop();
  24. System.out.println(watch.prettyPrint());
  25. }
  26. public static Integer testthreadMap(int countWorker,int countTask) {
  27. SmileMaster<Integer> smileMaster = new SmileMaster(new SmileWorker(new DefaultWorkerHandler() {
  28. @Override
  29. public Integer handler(Integer input) {
  30. return input * input;
  31. }
  32. }), countWorker);
  33. //提交100个子任务
  34. for (int i = 0; i < countTask; i++) {
  35. smileMaster.submit(i);
  36. }
  37. smileMaster.execute();
  38. Map<String, Object> resultMap = smileMaster.getResultMap();
  39. int re = 0;
  40. for (Map.Entry<String, Object> entry : resultMap.entrySet()) {
  41. String key = entry.getKey();
  42. Integer o = (Integer) resultMap.get(key);
  43. re += o;
  44. resultMap.remove(key);
  45. }
  46. return re;
  47. }
  48. public static Integer testExecutorService(int countWorker,int countTask) {
  49. ExecutorService executorService2 = Executors.newCachedThreadPool();
  50. SmileMaster smileMaster1 = new SmileMaster(new SmileWorker(new DefaultWorkerHandler() {
  51. @Override
  52. public Integer handler(Integer input) {
  53. return input * input;
  54. }
  55. }), countWorker, executorService2);
  56. for (int i = 0; i < countTask; i++) {
  57. smileMaster1.submit(i);
  58. }
  59. smileMaster1.executePool();
  60. Map<String, Object> resultMapPool = smileMaster1.getResultMapPool();
  61. int re1 = 0;
  62. for (Map.Entry<String, Object> entry : resultMapPool.entrySet()) {
  63. String key = entry.getKey();
  64. Integer o = (Integer) resultMapPool.get(key);
  65. re1 += o;
  66. resultMapPool.remove(key);
  67. }
  68. return re1;
  69. }
  70. }

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/102425336

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。