0

以下代碼正常工作,即打印Hello!,直到我按enter。當我按下輸入鍵時,它停止。如預期的那樣,這很好。線程基礎知識:爲什麼相同的代碼在不同的類中產生不同的輸出?

但是,當我的相同的代碼複製到名爲OneDataCached另一個類(所以它是不同的權只是類的名稱),它並不會達到預期效果。它,而打印Hello!,當我按下enter,它忽略了一個線,然後再次開始打印hello!

我感到困惑,爲什麼發生這種情況,任何提示或指針將不勝感激。

public class One { 
    static volatile boolean bool=true; 

    void stopThread(){ 
     bool=false; 
    } 

    public static void main(String [] args){ 

     new Thread(new Runnable() { 
      public void run(){ 
       while(bool){ 
        System.out.println("Hello!"); 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }).start(); 

     System.out.println("Press Return to stop ..."); 

     new Scanner(System.in).nextLine(); 
     new One().stopThread(); 

    } 

} 

enter image description here

複製後的代碼OneDateCached CLASS: -

enter image description here


編輯: -

public class OneDataCached { 
    static volatile boolean bool=true; 

    void stopThread(){ 
     OneDataCached.bool=false; 
    } 

    public static void main(String [] args){ 

     new Thread(new Runnable() { 
      public void run(){ 
       while(OneDataCached.bool){ 
        System.out.println("Hello!"); 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }).start(); 

     System.out.println("Press Return to stop ..."); 

     new Scanner(System.in).nextLine(); 
     new One().stopThread(); 

    } 

} 
+2

您是否使用'OneDataCached.bool'或'One.bool'? '靜態'這種方式很有趣 – MadProgrammer

+0

不同的'布爾'。 –

+0

@MadProgrammer爲了檢查,我改變了'while'循環的條件以及'stopThread()'中的'bool'到'OneDataCached.bool';但是這沒有幫助。雖然我認爲你的觀點非常合理。我編輯了這個問題。 – Solace

回答

1

也許你正在呼籲

new One().stopThread(); 

,而不是

new OneDataCached().stopThread(); 
+0

非常感謝。當我複製時,我忘了更改它。這工作。 – Solace

1

假設您已經逐字複製的代碼,那麼這兩個版本將被調用

new One().stopThread(); 

這意味着OneDataCached.bool是從來沒有改變過。 static是不是你的朋友,並會引發各種問題,如果你不警惕呢?

一種解決方案是創建一個特殊Runnable這是自包含...

public class Message implements Runnable { 

    private volatile boolean bool = true; 

    void stopThread() { 
     bool = false; 
    } 

    @Override 
    public void run() { 
     while (bool) { 
      System.out.println("Hello!"); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

而且那麼只有曾經與你想停止/修改,例如實例交互...

public class TestMessage { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

     Message message = new Message(); 
     Thread t = new Thread(message); 
     t.start(); 

     System.out.println("Press Return to stop ..."); 

     new Scanner(System.in).nextLine(); 
     message.stopThread(); 
    } 
} 
+0

非常感謝您的解決方案。它澄清了我的概念。 – Solace

1

如果

new Thread(new Runnable() { 
     public void run(){ 
      while(bool){ 
       System.out.println("Hello!"); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }).start(); 

One中聲明,名稱bool是指在One中聲明的static字段。如果在類SomeOther中聲明瞭相同的代碼,則它指的是在SomeOther中聲明的static字段。

但是,new One().stopThread();將始終修改您的線程未查看的One中聲明的字段。

相關問題