A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 〃Mr.Zぐ 中级黑马   /  2013-4-15 22:27  /  995 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

现在主线程到了某个位置时创建并启动了3个子线程:t1、t2和t3,仅当t1、t2、t3都完成自己任务(比如它们都要计算1到100之和)之后主线程才能执行其下面的工作(比如将t1、t2和t3的运算结果加起来并输出)。请问该如何实现这个功能?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 liuyangyang 于 2013-4-15 22:42 编辑

你好,
你可以用线程中join()方法去实现 。
大概思路:
先创建一个线程t。
你可以在某一时用t.join().让t这个线程去开辟三个线程(t1,t2,t3)并执行算数。
这样就可以完成你要的操作。
注意:一共是5条线程。主线程中方法用的t。join()方法。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
这个最好用java并法库java.util.concurrent中的Callable和Future来实现
Callable能够返回线程的运算结果并且保存在Future中
Future的get方法获取结果,并且可以使主线程阻塞,知道所有其他线程运行完
具体的可以参考api或者看张老师的java并法库
  1. import java.util.concurrent.*;
  2. import java.util.*;
  3. public class ExecutorsTest
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 ExecutorService threadPool = Executors.newFixedThreadPool(3);
  8.                 Collection<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();
  9.                 Callable<Integer> task1 = new Callable<Integer>(){
  10.                         public Integer call()throws Exception
  11.                         {
  12.                                 return 111111;
  13.                         }
  14.                 };
  15.                 Callable<Integer> task2 = new Callable<Integer>(){
  16.                         public Integer call()throws Exception
  17.                         {
  18.                                 return 222222;
  19.                         }
  20.                 };
  21.                 Callable<Integer> task3 = new Callable<Integer>(){
  22.                         public Integer call()throws Exception
  23.                         {
  24.                                 return 333333;
  25.                         }
  26.                 };
  27.                 tasks.add(task1);
  28.                 tasks.add(task2);
  29.                 tasks.add(task3);
  30.                 Integer sum = 0;
  31.                 try{
  32.                         List<Future<Integer>> retval = threadPool.invokeAll(tasks);
  33.                         for(int i=0;i<retval.size();i++)
  34.                         {
  35.                                 sum += retval.get(i).get();//get()方法会造成线程阻塞
  36.                         }
  37.                 }catch(Exception e){}
  38.                 System.out.println(sum);
  39.                 threadPool.shutdown();
  40.         }
  41. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马