我有一个基本上完成相同系列步骤两次的课程。听起来像是多线程程序的完美示例。我的问题是,如果我只用两个线程就可以做到这一点。这是事物的一般要点
Tester implements Runnable{
Thread obj1Thread, obj2Thread;
MyObj obj1, obj2;
String obj1Results, obj2Results;
void runTests(){
obj1Thread = new Thread(this, "ob1 thread");
obj2Thread = new Thread(this, "ob2 thread");
obj1.start();//builds up obj1
obj2.start();//builds up obj2
if(obj1 and obj2 are finished building){
System.out.println(obj1);
System.out.println(obj2);
}
obj1Thread.startSecondPhase()//runs a separate function that tests obj1 vs ob2. Essentially test(ob1, ob2)
obj2Thread.startSecondPhase()//runs a separate function that tests obj2 vs ob1. Essentially test(ob2, ob1)
if(obj1 and obj2 are finished testing){
System.out.println(obj1Results);
System.out.println(obj2Results);
}
}
}
我得到了第一部分 - 构建对象 - 工作。我现在的问题是 -
wait
,然后在线程notifyAll
之后对主线程进行等待?但那么线程如何获得主线程?也许是this
?澄清我想要具体的事件顺序 -
join()
编辑:另外,如何告诉特定线程我希望它们使用哪些对象?现在我以一种有点hacky的方式做这件事(我正在处理线程名称)。
答案 0 :(得分:2)
我会使用更高级别的抽象:使用执行和ExecutorService.invokeAll(Collection<? extends Callable<T>> tasks)
,它返回Future
的列表。
你的主线可以
执行程序服务和期货将处理引擎盖下的所有并发性。
修改强>:
我看到你的评论:
一个特殊的Runnable类只是为了实现一行代码? 也许我太过理想主义但对我来说感觉不对。
在这种情况下,您通常使用无内容类:
Future future = executorService.submit(new Runnable() {
public void run() {
System.out.println("Asynchronous task");
}
});
没错。当Java有lambda时,它会变得更短。
Future future = executorService.submit(() -> {System.out.println("Asynchronous task");});