2010-05-26 29 views
2

我已經創建了簡單的程序來測試Java中的線程。我希望它可以無限地打印我的數字,如123123123123123.不知道爲什麼,但是目前它在一個循環完成後僅停止213。有人知道爲什麼Java中的線程

public class Main { 
    int number; 

    public Main(int number){ 
    } 

    public static void main(String[] args) { 
     new Infinite(2).start(); 
     new Infinite(1).start(); 
     new Infinite(3).start(); 
    } 
} 

class Infinite extends Thread { 
    static int which=1; 
    static int order=1; 
    int id; 
    int number; 
    Object console = new Object(); 

    public Infinite(int number){ 
     id = which; 
     which++; 
     this.number = number; 
    } 

    @Override 
    public void run(){ 
     while(1==1){ 
      synchronized(console){ 
       if(order == id){ 
        System.out.print(number); 
        order++; 
        if(order >= which){ 
         order = 1; 
        } 
        try{ 
         console.notifyAll(); 
         console.wait(); 
        } 
        catch(Exception e) 
        {}      
       } 
       else { 
        try{ 
         console.notifyAll(); 
         console.wait(); 
        } 
        catch(Exception e) 
        {}      
       } 
      } 
      try{Thread.sleep(0);} catch(Exception e) {} 
     } 
    } 
} 

回答

9

您的每一個Infinite實例是同步的,然後就等着上自己的console對象的通知。一旦線程到達console.wait(),它不會繼續。

您似乎希望它們都在同一個對象上進行同步 - 因此您需要例如使console爲靜態。

+0

這就是我的想法。事實上,當我複製相同的代碼並刪除了.wait()和.notifyAll()時,我停止了程序運行時,我的控制檯上印着一串數字。 – npinti 2010-05-26 17:51:13

1

記住System.out.print(..)不會自動刷新輸出。

另外,請看java.util.concurrent.Semaphore。你可能能夠做你正在嘗試的東西(按預定義的順序執行線程),而無需同步和調用等待。

2

每個線程正在同步一個不同的對象。當控制轉到console.wait()時,正在執行的線程將等待另一個線程對控制對象調用notify()/ notifyAll()。沒有其他線程正在這樣做,因爲每個線程都有自己的控制對象副本。因此,所有線程在打印一次後都會無限期地等待。爲了解決這個問題,保持所有線程都可以等待的通用對象。