2016-03-30 4 views
2

Возможно, это просто сделать, но я не знаю, как это сделать.получить контекст потока java

Сначала у меня есть класс A, который создает один или несколько классов B (Runnable) с помощью Executor. Каждый класс B должен выполнять некоторые задачи, но я хочу знать, когда закончится каждый поток.

Class A { 
    private ScheduledExecutorService scheduler; 
    private int nbThread=3; 
    public A(){ 
     scheduler = Executors.newScheduledThreadPool(nbThread); 
    } 

    public start(){ 
     for (int i = 0; i < nbThread; i++) { 
      scheduler.execute(new B(); 
     } 
    } 

}

Class B implement Runnable { 

    public B(){ 

    } 

    @Override 
    public void run(){ 
     System.out.printl("test"); 
    } 

}

Теперь то, что я хочу делать другие задачи только тогда, когда эти 3 темы печатать каждый один (System.out.println ("тест") Если нить номер один не заканчивается, мы ничего не делаем. Я не очень силен в java, поэтому мне нужна помощь. спасибо

+0

ты опробовал [присоединяется?] (Https://docs.oracle.com/javase/tutorial/essential/concurrency/join. html) –

+0

нет, вы думаете, что это хорошее решение? Я ищу будущее, любую идею? спасибо – Caroline

ответ

3

Что вы можете пожелать для просмотра является интерфейс Future в параллельном пакете java.

Я обновил ваш метод 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 
} 

Update: альтернативное решение, если вы всегда хотите ждать, пока все задачи не выполняются, чтобы использовать 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; 
    } 
} 
+0

спасибо gustf, я буду тестировать сейчас. :) – Caroline

+0

, так что я задаю вопрос: как узнать, что каждый futur выполнен ? если у меня есть другой метод executeTeskAfterAllThread(), как узнать, выполняется ли весь текущий поток? – Caroline

+0

future.get() ждет, пока не будет выполнено будущее. поэтому каждая итерация в последнем цикле ожидает завершения текущего B. это означает, что после цикла (добавленный комментарий) все фьючерсы сделаны – gustf

Смежные вопросы