2011-11-16 50 views
-2

我真的不喜歡在旅途中發佈多個問題,抱歉,如果這是煩人的。同步是如何工作的?

我終於設法解決了我的問題。除了我不確定它是可靠的還是明智的。

public void run() { 
      // TODO Auto-generated method stub 


      float time = 0.01f; 
      try { 
       while(time < timer) 
       { 
         time+=0.1f; 
             Thread.sleep(100); 
       } 

      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 

     synchronized (ProgressBar.class) { 
      int val =++ProgressBar.threadCount; 
      if(val == 10) 
      { 
           System.out.println("All threads are finished!") ; 
      } 
     } 

    } 
} 

我已經測試了5分鐘,現在看來工作。 但有人可以解釋發生了什麼?當線程啓動時,它確保同步塊未被使用,否則等待它完成。 那它是一些排隊系統嗎? 再次感謝。 編輯:

以前的鏈接 How does AtomicInteger work?

Thread.join freezes progressbar

+0

怎麼了downvotes?這不是一個有效的問題嗎? –

+0

我還沒有投票,但我有我的問題與這個問題。你提到一個早期的問題,但不要鏈接到它(你期望我去搜索它嗎?)。你沒有解釋代碼應該做什麼。您的代碼示例不會顯示您的線程是如何創建的,也不會顯示您的案例中的ProgressBar。 – ibid

+2

閱讀 - http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – adatapost

回答

1

一個​​塊使用的對象的鎖,它指的是,你的情況ProgressBar.class。如果沒有其他線程擁有該鎖,則​​塊會獲取並繼續。如果鎖已經被另一個線程所擁有,則​​塊會進入休眠狀態,等待鎖釋放,然後再次嘗試。一旦擁有該鎖的線程完成​​塊,它將釋放該鎖,這會導致至少有一個等待該鎖的線程嘗試獲取該鎖。

(這種解釋忽視了同一個線程可以釋放它之前獲得鎖幾次。只要線程擁有該鎖至少一次,其他所有線程都從獲取它阻塞的可能性。)

the Java Language Specification

+0

是的,我想這就是我想知道的。 我有一個鎖定,阻止另一個線程遞增計數器。強制其他線程在可以使用該代碼塊之前等待。只要它不是無限期的那麼我猜就沒事了。謝謝 –

+0

感謝您的鏈接 –