也许这很简单,但我不知道如何做。
首先,我有一个A类,它用Executor创建一个或多个B类(Runnable)。 每个B类必须完成一些任务,但我想知道每个线程何时完成。
Class B implement Runnable {
public B(){
}
@Override
public void run(){
System.out.printl("test");
}
}
{{1}}
}
现在我想要的是只在这3个线程打印每个任务时才执行其他任务(system.out.println(" test") 如果第一个线程没有完成,那么我们就会做任何事情。 我在java方面不是很强,所以我需要一些帮助。 感谢
答案 0 :(得分:3)
您可能希望查看的是java并发包中的Future
接口。
我更新了您的start
方法,为您提供了如何使用它的示例。
public void start() {
Future<?>[] futures = new Future[nbThread];
for (int i = 0; i < nbThread; i++) {
futures[i] = scheduler.submit(new B());
}
for (int i = 0; i < nbThread; i++) {
try {
futures[i].get(); // waits until the current B is done, and then just returns null
} catch (Exception e) {
e.printStackTrace();
}
}
// All futures now finished executing
}
更新:如果您总是希望等到所有任务完成,则使用ExecutorService.invokeAll
作为替代解决方案。与以下示例类似(请注意,我更改了B
以实现Callable
。
class A {
private ScheduledExecutorService scheduler;
private int nbThread = 3;
public A() {
scheduler = Executors.newScheduledThreadPool(nbThread);
}
public void start() {
List<Callable<Object>> callables = new ArrayList<>();
callables.add(new B());
callables.add(new B());
callables.add(new B());
try {
scheduler.invokeAll(callables); // blocks until all B finished executing
} catch (InterruptedException e) {
e.printStackTrace();
}
// All B's now finished executing
}
}
class B implements Callable<Object> {
public B() {
}
@Override
public Object call() throws Exception {
System.out.println("test");
return null;
}
}