2016-09-30 69 views
0

我有2關於Thread的問題,我只是想澄清一些事情。隨着下面的代碼:銷燬/停止線程

public class MyThread implements Runnable { 

    Boolean StopThread = false; 
    Boolean DontLoop = false; 
    public MyThread(){} 

    public void Stop(Boolean stopThread){ 
     this.StopThread = stopThread; 
    } 

    public void ThreadDontLoop(Boolean dontLoop){ 
     this.DontLoop = dontLoop; 
    } 

    public void run(){ 
     if(dontLoop){ 
      while(true){ 
       if(StopThread){ 
        break; //Terminate WhileLoop, This will Stop and destroy the Thread also 
       } 
      } 
     }else{ 
      //Does this mean the Thread will be destroy/terminate after this condition? 
     } 
    } 
} 

爲了開始:

MyThread myThread = new MyThread(); 
Thread thread = new Thread(myThread); 
thread.start(); 

爲了啓動線程,但不循環

ThreadDontLoop(false); 
thread.start(); 

爲了停止線程

myThread.Stop(true); 

現在,據此LINK,這就是要停止的線程。

所以我的第一個問題是,在上面給出的代碼中,如果我調用ThreadDontLoop(false);,然後thread.start();,這是否意味着線程將啓動,但在條件之後,線程將被停止並銷燬?

第二個問題是,比方說,我打電話thread.start();,然後我呼籲myThread.Stop(true);停止WhileLoop和銷燬線程。 我沒有關注如何鏈接停止線程,因爲我將有不同的條件,但我相信我想停止線程的邏輯是正確的?

+1

除非您需要'StopThread'或'DontLoop'爲'null',否則請使用boolean而不是'Boolean'。 –

+0

@AndyTurner - 謝謝!我不知道,現在我正在尋找「布爾」和「布爾」之間的區別。謝謝! – lopi

+0

@lopi boolean是一個基元,只能是真或假。布爾是一個對象的引用,默認情況下它是空的。 –

回答

1

您需要一個volatile boolean或者該值可以內聯並且永不顯示更改。

在給定的代碼上面,如果我調用ThreadDontLoop(false);然後thread.start();這是否意味着線程將開始,但在條件之後,線程將被停止並銷燬?

是的。

比方說,我打電話給thread.start();然後再調用myThread.Stop(true);停止WhileLoop並銷燬線程。我沒有關注鏈接是如何停止線程的,因爲我將有不同的條件,但我相信關於如何停止線程的邏輯是正確的?

如果您沒有可見性問題(線程看到您的更改),它將停止。在問題中的代碼中,最有可能的是代碼將被優化以假定線程從不會看到更改。

+0

@ PeterLawrey-謝謝你,對於遲到接受你的回答感到抱歉,我現在必須先學習有關'volatile'的問題。謝謝! – lopi