2011-12-22 67 views
-1

在閱讀有關信號量之後,我嘗試了這個測試代碼,我在其中創建了兩個線程A和B.我的目標是,讓線程A等待線程B中某些操作的10秒完成。但是由於我稍微改變了線程B中的邏輯,通過引入一個永遠不會出現的無限循環,線程A也掛起,並且程序永遠運行。任何人都可以幫助我實現我期待的目標嗎?信號量和線程問題

包裝;

import java.util.concurrent.Semaphore; 

public class Concurrency { 
    public int count = 0; 

    public static void main(String args[]) throws Exception { 
    final Semaphore sem = new Semaphore(1, true); 
    Thread thrdA, thrdB; 
    thrdA = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      synchronized (sem) { 
       try { 
        sem.wait(10000); 
        System.out.println("thread1"); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 

     } 
    }); 
    thrdB = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      synchronized (sem) { 
       System.out.println("thread2"); 

       while(true){ 

       } 
      } 

     } 
    }); 

    thrdA.start(); 
    thrdB.start(); 

    thrdA.join(); 
    thrdB.join(); 

    } 
} 
+4

爲什麼你在使用'Semaphore'如果你從來沒有'acquire()'然後'release()'它呢?你可以爲此使用一個'private final Object'。 – corsiKa 2011-12-22 06:08:56

回答

0

Glowcoder是正確的 - 這將永遠運行,因爲你的線程沒有做任何有用的事情。 thrdA正在等待信號量,thrdB永遠循環無用 - 它應該在某個時刻對信號量做些什麼,以便thrdA能夠超越等待。

2

你的代碼有很多問題。

  1. 正如評論和答案中所述,如果您想等待/通知您不必使用Semaphore
  2. while(true)給CPU帶來沉重的負擔。考慮使用Thread.sleep,或者獲取一個信號/鎖。
  3. 您需要詳細說明您想要達到的目標。如果你想讓threadB等待threadA,你不需要任何信號/鎖。在撥打thread2.run之前撥打電話thread1.join()
+0

1.yeah我同意雖然(真)是很多的CPU負載,但這只是一個實驗代碼,我寫了,看看會發生什麼,如果第二個線程掛起,並且第一個線程等待第二個超時10秒。 2.另外,由於某些限制,我無法在我的代碼中使用Thread.sleep。 – 2011-12-22 07:03:52