当前位置: 首页 > 编程日记 > 正文

假如有Thread1、Thread2、ThreaD3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?...

有两种方法:

  第一种方法:

一般情况,我们实现多线程都是Thread或者Runnable(后者比较多),但是,这两种都是没返回值的,所以我们需要使用callable(有返回值的多线程)和future(获得线程的返回值)来实现了。

  1. /** 
  2.  * 假如有Thread1、Thread2、ThreaD3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现? 
  3.  */  
  4. public class TestThread {  
  5. public static void main(String[] args) {  
  6. ThreadCount tc = null;  
  7. ExecutorService es = Executors.newCachedThreadPool();//线程池  
  8. CompletionService<Integer> cs = new ExecutorCompletionService<Integer>(es);  
  9. for(int i=0;i<4;i++){  
  10. tc = new ThreadCount(i+1);  
  11. cs.submit(tc);
  12. }
  13. // 添加结束,及时shutdown,不然主线程不会结束  
  14. es.shutdown();
  15. int total = 0;  
  16. for(int i=0;i<4;i++){  
  17. try {  
  18. total+=cs.take().get();
  19. catch (InterruptedException e) {  
  20. e.printStackTrace();
  21. catch (ExecutionException e) {  
  22. e.printStackTrace();
  23. }
  24. }
  25. System.out.println(total);
  26. }
  27. }
  28. class ThreadCount implements Callable<Integer>{  
  29. private int type;  
  30. ThreadCount(int type){  
  31. this.type = type;  
  32. }
  33. @Override  
  34. public Integer call() throws Exception {  
  35. if(type==1){  
  36. System.out.println("C盘统计大小");  
  37. return 1;  
  38. }else if(type==2){  
  39. Thread.sleep(20000);  
  40. System.out.println("D盘统计大小");  
  41. return 2;  
  42. }else if(type==3){  
  43. System.out.println("E盘统计大小");  
  44. return 3;  
  45. }else if(type==4){  
  46. System.out.println("F盘统计大小");  
  47. return 4;  
  48. }
  49. return null;  
  50. }
  51. }

ps:一个需要注意的小细节,cs.take.get()获取返回值,是按照完成的顺序的,即上面案例返回顺序是CEFD

 第二种方法:

第一种方法:

直接用join把线程5加入进去即可

第二种方法:

用Java.util.concurrent下的方法解决

用CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行

CountDownLatch 是计数器, 线程完成一个就记一个, 就像 报数一样, 只不过是递减的.

一个例子如下:

  1. public class CountDownLatchDemo {      
  2. final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");      
  3. public static void main(String[] args) throws InterruptedException {      
  4. CountDownLatch latch=new CountDownLatch(2);//两个工人的协作      
  5. Worker worker1=new Worker("zhang san", 5000, latch);      
  6. Worker worker2=new Worker("li si", 8000, latch);      
  7. worker1.start();//      
  8. worker2.start();//      
  9. latch.await();//等待所有工人完成工作      
  10. System.out.println("all work done at "+sdf.format(new Date()));      
  11. }
  12. static class Worker extends Thread{      
  13. String workerName;
  14. int workTime;      
  15. CountDownLatch latch;
  16. public Worker(String workerName ,int workTime ,CountDownLatch latch){      
  17. this.workerName=workerName;      
  18. this.workTime=workTime;      
  19. this.latch=latch;      
  20. }
  21. public void run(){      
  22. System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date()));      
  23. doWork();//工作了      
  24. System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date()));      
  25. latch.countDown();//工人完成工作,计数器减一      
  26. }
  27. private void doWork(){      
  28. try {      
  29. Thread.sleep(workTime);
  30. catch (InterruptedException e) {      
  31. e.printStackTrace();
  32. }
  33. }
  34. }
  35. }

CyclicBarrier        : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。

这样应该就清楚一点了,对于CountDownLatch来说,重点是那个“一个线程”, 是它在等待, 而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。而对于CyclicBarrier来说,重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。CyclicBarrier更像一个水闸, 线程执行就想水流, 在水闸处都会堵住, 等到水满(线程到齐)了, 才开始泄流.

转载于:https://www.cnblogs.com/xiaoxingxing123/p/7865377.html

相关文章:

ORA-00907:缺少右括号

在创建以下表的时候出现ORA-00907&#xff1a;缺少右括号的错误&#xff0c;最后发现是字符串类型写错了&#xff0c;VARCHAR2写成了VARCAHR2&#xff0c; /**//* DBMS name: ORACLE Version 9i2 *//* Created on: 2010-4-23 12:28:27 …

Java Web项目第二次总结

学生管理系统 问题 jQuery 不熟悉El需要复习servlet的内置对象 新认识的知识 利用servlet的 Session对象实现权限的验证。它的作用是:只能通过登录后才能进入主界面&#xff0c;否则不能进入。没有加权限验证前是可以根据页面的完整路径进入主界面&#xff0c;可以不输入密…

软件项目中的需求分析具体方法探讨之一

这家单位&#xff0c;我进去没多久&#xff0c;满打满算也就刚两月多一周而已。我也不是开发部的人&#xff0c;但是&#xff0c;看到了一些事情&#xff0c;纯为有感而发。领导想做个CRM&#xff0c;于是&#xff0c;开发部的人写了&#xff0c;当然&#xff0c;正式的需求分析…

portscaner 多线程、多协程并发端口扫描

import socket,time,re,sys,os,threading import gevent from gevent import monkey monkey.patch_all()socket.setdefaulttimeout(2)#该方法用来处理用户数据的port范围&#xff0c;并计算范围内的port&#xff0c;将其添加到列表中&#xff0c;将列表返回 def handle_port(in…

POJ 2828 Buy Tickets | 线段树的喵用

题意: 给你n次插队操作,每次两个数,pos,w,意为在pos后插入一个权值为w的数; 最后输出1~n的权值 题解: 首先可以发现,最后一次插入的位置是准确的位置 所以这个就变成了若干个子问题, 所以用线段树维护一下每个区间剩余多少位置可选 对于一个pos 如果左儿子的剩余超过当前位置,就…

Ext结合DWR的关键代码(运行成功的DWRProxy)

关键代码如下&#xff1a;Store为&#xff1a;var ds new Ext.data.Store({ proxy: new Ext.data.DWRProxy({ callback: Folder.getMessageList, params: { start: 0, limit: PAGE_SIZE } }), // proxy: new…

serlvet 九大内置对象

隐式对象 说明 request 转译后对应HttpServletRequest/ServletRequest对象 response 转译后对应HttpServletRespons/ServletResponse对象 session 转译后对应HttpSession对象 application 转译后对应ServletContext对象 out 转译后对应JspWriter对象&#xff0c;其…

网路游侠:某软件版WEB应用防火墙试用

去年的这个时候&#xff0c;游侠(www.youxia.org)认为WAF都是硬件的&#xff0c;后来在网上看到这个在国内做的不错的牌子。居然是软件的WAF&#xff0c;这样的话&#xff0c;一些服务器在机房托管的用户就特别需要这样的产品&#xff0c;因为1U的设备在电信机房的托管费用都有…

P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖

二分图最小不相交路径覆盖 #include<bits/stdc.h> using namespace std; const int MAXN 5550; const int MAXM 1000005; const int INF 1000000050; int Head[MAXN], cur[MAXN], lev[MAXN], to[MAXM << 1], nxt[MAXM << 1], f[MAXM << 1], ed 1, …

IO流 字符流 字节流 缓冲流 文件的复制

IO流 IO概述 IO流就是一个管道&#xff0c;是用来在设备之间传输数据 input&#xff1a;相对于内存/程序 往进走输入流 output&#xff1a;相对于内存/程序 往硬盘写入 分类 根据数据进出方式 1、输出流&#xff1a; FileWriter 字符输出流BufferedWriter 字符缓冲输出…

强烈推荐:240多个jQuery插件

http://www.cnblogs.com/Terrylee/archive/2007/12/09/the-ultimate-jquery-plugin-list.html转载于:https://www.cnblogs.com/HughTan/archive/2010/05/14/1735376.html

FreeBSD Ports加速的方法

使用代理。 在/etc/make.conf中设置&#xff1a;FETCH_ENV "HTTP_PROXYIP[:端口]"如果需要&#xff0c;在FETCH_ENV值后面加入空格&#xff0c;HTTP_PROXY_AUTHbasic:*:user:password利用其他机器下载的文件... 首先&#xff0c;请确保2台机器cvsup的一致&#xff0…

AngularJS ng-if使用

示例中&#xff0c;根据ng-if指令显示不同任务状态&#xff0c;以及判断任务是否可以操作 <div ng-app"NgifDemoApp" ng-controller"NgifDemoContrl as vm"><h1>任务列表</h1><table class"table"><thead><tr&…

一、Tableau基础

有关函数的官方文档&#xff1a;https://onlinehelp.tableau.com/current/pro/desktop/zh-cn/functions_functions_string.htm 注意事项&#xff1a; 1.记录数:是Tableau自动给每行观测值赋值为1。 2.维度的字段&#xff0c;是不能用于计算的&#xff0c;若是要用于计算&#x…

关于OGNL表达式中的%,$,#

OGNL表达式非常强大&#xff5e;其中#、%、$这三个符号在OGNL表达式中经常出现&#xff0c;而这三种符号也是开发者不容易掌握和理解的部分&#xff0c;要认真区分。1&#xff0e;#符号的用途一般有三种。 1)访问非根对象属性&#xff0c;例如示例中的#session.msg表达式&#…

JavaWeb项目第三次总结_成绩查询的实现

查询图书的功能实现 如何知道浏览器往服务器传入的参数 1、在编写好查询页面后&#xff0c;使用火狐浏览器的friebug &#xff08;全部—>POST—>参数&#xff09; 2、编写GradeListServlet&#xff0c;重写doGet&#xff08;&#xff09;和doPOST&#xff08;&#x…

cisco路由交换系统测试命令

路由交换系统测试命令通用测试命令&#xff1a;ping X.X.X.X &#xff1a;标准ping命令&#xff0c;用于测试设备间的物理连通性ping &#xff1a;扩展ping命令&#xff0c;也用于设备间的物理连通性&#xff0c;扩展ping命令还支持灵活定义ping命令的参数&#xff0c;比…

jquery下拉菜单

自己写的一个菜单(因为是初学 不知道能不能算无限级)jquery $(document).ready(function(){ $("ul li").hover(function(){ $(this).find("ul:first").show();//鼠标滑过查找li下面的第一个ul然后显示&#xff1b;},function(){ …

MongoDB update修改器: 针对Fields的$修改器 $inc $set $unset

MongoDB update修改器: $inc $set $unset $push $pull $pop 针对Fields的$修改器 $set&#xff1a; { $set: { key: value } } $set:{"gender":"男"} 解释: $set 是update时的关键字,表示我要设置gender属性的值为"男" 如果该条Documents没有gen…

都是些什么人!

都是些什么人&#xff01;转载于:https://www.cnblogs.com/liyugeng/p/7877615.html

IO流(二)转换流、序列化、commons-IO框架

转换流 介于字符流和字节流之间的流 字节流与字节流相互转换 OutputStreamWriter 输出流&#xff0c;按照指定的字符集编码&#xff0c;把字符流转化成字节数据 编码&#xff1a;把字符数据转换成字节数据&#xff1b; 解码&#xff1a;把字节数据转换成字符数据 二进制数据—&…

Http之Get/Post请求区别

今天在网上看了一些关于http 协议中get 和Post的文章。在此做一个总结&#xff0c;当是做一个笔记吧。 一、什么是HTTP-GET和HTTP-POST HTTP-GET和HTTP-POST是使用HTTP的标准协议动词&#xff0c;用于编码和传送变量名/变量值对参数&#xff0c;并且使用相关的请求语义。每个HT…

[vb+mo] visual baisc 6.0 基于mapobjects 2.4 开发的数字化校园电子地图

程序的源代码下载地址: https://docs.google.com/ 请安装VB6.0企业版(不是企业版运行会报错,因为缺少相应的控件)和ESRI MO2.4 程序的质量一般,因为时间仓促,主要是毕业设计时间仓促.希望大家多多改进.有什么问题可以发邮件欢迎交流. 程序的主窗口代码: 通用变量定义Private l…

vsftp部署

1.安装该软件需要使用最高用户&#xff08;root&#xff09;进行安装&#xff0c;否则不能进行。 2.首先用命令检查VSFTP是否已经安装。chkconfig --list | grep vsftpd 3.安装vsftp。yum install –y vsftpd 4.启动vsftp。service vsftpd start 5.添加一个ftp用户。useradd f…

线程、线程匿名内部类、解决线程不安全的方式

线程 线程&#xff1a;正在运行的程序&#xff0c;是程序的执行路径&#xff1b;多线性 进程&#xff1a;是应用程序的载体&#xff0c;程序运行在虚拟机中。一个应用软件对应一个进程。 一个进程包含多个线程&#xff0c;一个线程对应一个进程。 好处&#xff1a;提高软件的运…

工作流编程循序渐进(9:使用本地服务在宿主和工作流之间通信)

工作流编程循序渐进&#xff08;9&#xff1a;使用本地服务在宿主和工作流之间通信&#xff09; 作者 朱先忠 &#xff3b;摘要&#xff3d;在本篇中&#xff0c;首先详细分析本地服务有关概念&#xff0c;探讨本地服务在工作流运行时、工作流实例及工作流宿主间的地位及作用…

使用Properties连接数据库

使用Properties连接数据库 要注意的是&#xff1a; 1.通过配置文件来连接数据库时&#xff0c;连接信息要以 mysql.XXX开头,否则会提示异常。 java.sql.SQLException: Access denied for user localhost (using password: YES)生成配置文件的实现代码 1、创建写入配置信息工…

两边横线,中间标题

<!DOCTYPE html> <html> <head> <title>两边横线&#xff0c;中间标题</title> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <style type"text/css"> <!--ul { mar…

交换机基础配置

请同学们下载附件中的实验并完成。转载于:https://blog.51cto.com/coffee0546/204093

python高级-模块(14)

一、python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数&#xff0c;必须用语句#include <math.h>引入math.h这个头文件&#xff0c;否则是无法正常进行调用的。 那么在Python中&#xff0c;如果要引用一些其他的函数&#xff0c;该怎么处理呢&am…