2014-12-02 90 views
-2

你好主要的想法是,如果男性>女性,女性線程必須等待1000毫秒(1秒),然後再次檢查。我試圖尋找這個,但我無法找到解決方案。可能有人請幫助我嗎?(我剛開始學習線程)Java線程sleep()的幫助

public class A implements Runnable { 

    public void run(){ 
    } 

    public static void main(String[] args)throws InterruptedException { 
     int n = 3; 
     int m = 17; 
     int f = 13; 

     Thread th1 = new Thread(new male(m,n)); 

     Thread th2 = new Thread(new female(f,n)); 

     th1.start(); 
     th2.start(); 

     //not working 
     if (m>f){ 
       th2.sleep(1000); 
     } 
     else if(f>m){ 
       th1.sleep(1000);  
     } 
    } 

} 

class male extends A { 

    public male(int male, int count){ 
     while(male>0){ 
      male -= count; 
      System.out.println("m: " + male); 
     } 
    } 
} 

class female extends A { 

    public female(int female, int count){ 
     while(female>0){ 
      female -= count; 
      System.out.println("f: " + female); 
     } 
    } 
} 
+5

插入明顯的性別歧視笑話,女性可以在這裏等待任何東西。 – 2014-12-02 22:25:18

+0

如果您遵循以下準則,您的代碼將更具可讀性:http://www.oracle.com/technetwork/java/codeconventions-135099.html – 2014-12-02 22:25:34

+0

我不知道爲什麼,但我看到了這個問題的'其他'圖像: O – 2014-12-02 22:30:16

回答

2

Thread.sleep方法是一個static方法,它將當前線程「休眠」一段時間。它不能用來讓其他線程進入睡眠狀態......就像你正在嘗試做的那樣。

如果您希望子線程定期休眠,那麼sleep的調用需要由各自的線程自己完成;例如在各自的run()方法中。

對於什麼值得...沒有安全方式爲一個線程導致另一個線程睡覺或暫停。有一個用於暫停另一個線程的棄用API,但它有許多安全和安全問題,不應使用。


還有另一個問題。當你實例化這些類時,你已經把這些邏輯放入構造函數中。在「新」MaleFemale對象時,會在主線程上發生這種情況。你希望代碼在子線程中運行......當它們啓動時。

您的MaleFemale類需要實現Runnable.run()方法,這就是需要實現線程邏輯的地方。

+0

您應該得到一個編譯器警告,用於調用帶有實例的「sleep」。如果沒有,請檢查您的編譯器設置並打開所有警告。 – Robert 2014-12-02 23:54:48

+0

@Robert - 這取決於編譯器... – 2014-12-03 01:28:28

0

對於初學者來說,而不是有A類是doesnothing除了主要方法並且實現Runnable並且有男性和女性的擴展A,考慮有男性和女性才能實現Runnable自己。其次,你的男性和女性方法在其運行方法中不包含任何內容,所以沒有什麼可以在另一個線程上運行。因此,你的線程首先無所作爲。

+0

*是Runnable的直接子類*您可能的意思是「實現」,因爲「Runnable」是一個接口,而不是抽象類。 – 2014-12-02 22:34:15