2011-01-19 73 views
0

Pausing a Thread爲例。如果我使用notifyAll而不是通知,是否有任何副作用,是否有必要?通過使用notifyAll來恢復線程

+0

我知道我是題外話,但它能夠更好地使用併發實用程序等待和通知。 – 2011-01-19 01:42:03

+0

@ doc_180,然後向我展示一種常用的已知方法,即使用併發實用程序來暫停和恢復線程。 – 2011-01-19 05:13:43

+0

你會比閱讀Doug Lea關於併發性的書更糟糕。無論如何,這裏是一個簡單的執行者和閂鎖樣本。代碼示例在下面的分開的答案。 – 2011-01-19 06:31:07

回答

6

在那個例子中,它沒有任何區別,因爲只有一個線程正在等待。

notifynotifyAll之間的區別在於後者喚醒所有服務員,而不是一個。

0

如果您可以讓多方在對象上等待,則使用no​​tifyAll而非通知非常重要。如果只有一個線程等待,那麼調用notify和notifyAll沒有區別。

1

在「Effective Java」第69項中,Bloch建議「始終使用notifyAll」。

-1

創建一個新的可運行。在運行方法中,「開始」倒數計時器正在等待,並且將不允許執行,除非在預定義時間內使用該鎖存器上的調用倒計時釋放。在這種情況下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"); 
    }