黑马程序员技术交流社区
标题:
java多线程
[打印本页]
作者:
〃Mr.Zぐ
时间:
2013-4-15 22:27
标题:
java多线程
现在主线程到了某个位置时创建并启动了3个子线程:t1、t2和t3,仅当t1、t2、t3都完成自己任务(比如它们都要计算1到100之和)之后主线程才能执行其下面的工作(比如将t1、t2和t3的运算结果加起来并输出)。请问该如何实现这个功能?
作者:
liuyangyang
时间:
2013-4-15 22:40
本帖最后由 liuyangyang 于 2013-4-15 22:42 编辑
你好,
你可以用线程中join()方法去实现 。
大概思路:
先创建一个线程t。
你可以在某一时用t.join().让t这个线程去开辟三个线程(t1,t2,t3)并执行算数。
这样就可以完成你要的操作。
注意:一共是5条线程。主线程中方法用的t。join()方法。
作者:
谢波
时间:
2013-4-16 15:50
这个最好用java并法库java.util.concurrent中的Callable和Future来实现
Callable能够返回线程的运算结果并且保存在Future中
Future的get方法获取结果,并且可以使主线程阻塞,知道所有其他线程运行完
具体的可以参考api或者看张老师的java并法库
import java.util.concurrent.*;
import java.util.*;
public class ExecutorsTest
{
public static void main(String[] args)
{
ExecutorService threadPool = Executors.newFixedThreadPool(3);
Collection<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();
Callable<Integer> task1 = new Callable<Integer>(){
public Integer call()throws Exception
{
return 111111;
}
};
Callable<Integer> task2 = new Callable<Integer>(){
public Integer call()throws Exception
{
return 222222;
}
};
Callable<Integer> task3 = new Callable<Integer>(){
public Integer call()throws Exception
{
return 333333;
}
};
tasks.add(task1);
tasks.add(task2);
tasks.add(task3);
Integer sum = 0;
try{
List<Future<Integer>> retval = threadPool.invokeAll(tasks);
for(int i=0;i<retval.size();i++)
{
sum += retval.get(i).get();//get()方法会造成线程阻塞
}
}catch(Exception e){}
System.out.println(sum);
threadPool.shutdown();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2