检索线程上下文java

时间:2016-03-30 20:25:44

标签: java multithreading algorithm executorservice

也许这很简单,但我不知道如何做。

首先,我有一个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方面不是很强,所以我需要一些帮助。 感谢

1 个答案:

答案 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;
    }
}