2011-01-19 2 views
0

Возьмите пример Pausing a Thread. Если я использую notifyAll вместо того, чтобы уведомлять, есть ли побочный эффект, и это необходимо?Возобновление потока с помощью notifyAll

+0

Я знаю, что я отвлекаюсь, но лучше использовать утилиты параллелизма, чтобы ждать и уведомлять. –

+0

@ doc_180, а затем покажите мне общеизвестный способ приостановить и возобновить поток, используя утилиты параллелизма. –

+0

Вы будете делать хуже, чем читать книгу Дуга Ли о параллелизме. В любом случае здесь идет простой исполнитель и образец защелки. Образец кода в отдельном ответе ниже. –

ответ

6

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

Разница между notify и notifyAll заключается в том, что последний разбудит всех официантов, а не только один.

+1

Другое дело отметить, что с notify() у вас нет контроля над тем, что поток проснулся, это произвольный выбор. Поэтому, если вам нужен приоритет смещения вообще, вам нужно будет искать более продвинутую реализацию в java.util.concurrent. – berry120

0

Использование уведомления. В отличие от уведомлений важно, если на объекте может быть несколько сторон. Если только один поток когда-либо ждет, тогда нет никакой разницы между вызовом notify vs notifyAll.

1

В «Effective Java» пункта 69, Блох предлагает «всегда использовать notifyAll».

-1

Создать новый runnable. В методе запуска «start» countdownlatch ожидает и не позволит выполнить выполнение, если оно не будет выпущено с использованием обратного отсчета вызовов на этой защелке в течение предопределенного времени. В этом случае 1. (так как старт передается 1 как совпадающий нет)

// Пересмотренный ответ. // Прогонный класс.

public class WorkerThread implements Runnable 
    { 
     CountDownLatch start; 

     CountDownLatch end; 

     String name; 

     WorkerThread(CountDownLatch startLatch, CountDownLatch stopLatch) 
     { 
      this.start = startLatch; 
      this.end = stopLatch; 

     } 

     public void run() 
     { 
      try 
      { 

       start.await(); 
      } catch (InterruptedException ex) 
      { 
       ex.printStackTrace(); 
      } 
      System.out.println("Will run when start is released "); 
      end.countDown(); 
     } 
    } 

// Это метод точки входа, который выполняет рабочий поток.

public void initiateProcess (final int count) { 
      CountDownLatch start = new CountDownLatch(1); 
     CountDownLatch stop = new CountDownLatch(count); 
     for (int i = 0; i < count; i++) 
     { 
      new Thread(new WorkerThread(start, stop)) 
        .start(); 
     } 
     System.out.println("Go"); 
// This is where start latch is released. Now worked thread can complete its function. 
     start.countDown(); 
     try 
     { 


// Stop will wait until stop latch is countdowned to zero from count param. (see count param) 
      stop.await(); 
     } catch (InterruptedException ex) 
     { 
      ex.printStackTrace(); 
     } 
     System.out.println("Finished"); 
    } 
+0

Он не показывает точно, как вы приостанавливаете и возобновляете поток. –

+0

Хм ... Вы, вероятно, правы, я спешил опубликовать небольшой образец защелки. Я пересмотрел ответ. –

+0

Скопируйте этот класс и запустите его в режиме отладчика. Это поможет лучше понять countdownlatch. –

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