2015-12-24 1 views
0

Я хочу, чтобы мой основной поток подождал, пока один из многих сигналов потоков не будет завершен.Ждите основную нить до тех пор, пока один из многих сигналов нитей в Java

Мне не нужно ждать, пока все они будут сигнализировать \ закончить, только один.

Какова будет наилучшая практика выполнения такого требования?

+0

положить на некоторый код также о том, как вы создаете темы, как все потоки, созданные одним исполнителем или многих исполнителей создавать темы .. дать только скелет создания потока – awsome

+0

использования а [ блокировка] (https://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html) –

ответ

3

CountDownLatch будет делать то, что вы хотите. Инициализируйте его до 1 и подождите. Первый поток до countDown() на нем позволит продолжить поток.

public class CountDownLatchTest 
{ 
    public static void main(String[] args) throws InterruptedException { 
     CountDownLatch gate = new CountDownLatch(1); 
     for(int i = 0; i < 3; i++) { 
     new Thread(new RandomWait(gate, i)).start(); 
     } 
     gate.await(); 
     System.out.println("Done"); 
    } 

    private static class RandomWait implements Runnable 
    { 
     CountDownLatch gate; 
     int num; 
     public RandomWait(CountDownLatch gate, int num) 
     { 
     this.gate = gate; 
     this.num = num; 
     } 

     public void run() { 
     try { 
      Thread.sleep((int)(Math.random() * 1000)); 
      System.out.println("Thread ready: "+num); 
      gate.countDown(); 
     } catch(InterruptedException ex) { 
     } 
     } 
    } 
} 
0

Вы делаете что-то вроде этого

boolean complete=false; 
Object waitSync = new Object(); 


// the waiter has something like this 

void waitFor() { 
    synchronized (waitSync) { 
     try { 
      while (!complete) 
       waitSync.wait(); 
     } catch (Exception e) {} 
    } 
} 

// each worker calls something like this when completed 

      synchronized (waitSync) { 
      complete = true; 
      waitSync.notifyAll(); 
     } 
0

Чем проще Condition интерфейс будет делать. В качестве дополнительного бонуса вы получите, чтобы выбрать блокировку с помощью Lock.newCondition()

CountdownLatch может быть освобожден только один раз, так что может или не может быть то, что вы хотите.

Смотрите также: Put one thread to sleep until a condition is resolved in another thread

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