2014-01-16 58 views
1
import java.lang.Thread; 
import java.util.Scanner; 

class Running extends Thread{ 

    private boolean Run=true; 

    public void shutdown(){ 
     Run=false; 
    } 
    public void run(){ 
     while(Run){ 
      for(int i=0;i<1000;i++){ 
       System.out.println("Starting Counter:"+i); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

public class Volatile { 
    public static void main(String[] args) { 
     Running run1=new Running(); 
     run1.start(); 
     System.out.println("Press any key to stop thread execution"); 
     Scanner sc=new Scanner(System.in); 
     sc.nextLine(); 
     run1.shutdown(); 
    } 
} 

我正在使用volatile關鍵字來停止線程執行。但無法得到解決我該怎麼做才能停止線程執行?

+2

我不在你的代碼中使用「volatile關鍵字」。 – Gray

+0

只要條件成立,它就會運行,使條件成爲超出循環條件 – Saqib

+0

作爲一個側面問題,按一個鍵不會停止執行線程。無論您鍵入控制檯,您都需要按Enter鍵。 – Jems

回答

-1

這些是樣品。你可以創建一個布爾字段,並檢查它的內部運行:

public class Sample implements Runnable { 

    private volatile boolean isRunning = true; 

    public void run() { 

    while (isRunning) { 
     //do work 
    } 
    } 

    public void kill() { 
     isRunning = false; 
    } 

} 

要停止它只需調用

sample.kill(); 

這應該工作。

0

前一段時間線程停止,只需調用Threadstop()函數即可。現在,它已被棄用,因爲它不安全,所以您必須從Thread的內部停止Thread。你會發現一個很好的例子here。請記住,這樣做並不會立即停止該線程,它只是告訴它可用於停止,Android會在發現它需要時停止它。

1

您使用的是正確的模式,但應用它有點不對勁:

Run標誌將只有1000秒後進行檢查,因爲畢竟for循環完成後只會進行檢查。你的代碼更改爲以下:

public void run(){ 
    while(Run){ 
    for(int i=0;(i<1000) && (Run == true);i++){ 

     System.out.println("Starting Counter:"+i); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     } 
    } 
} 

請注意,您必須完全去掉while循環,如果你不想讓你的被無休止有效的執行循環。

4

我該怎麼做才能停止執行線程?

因此,您的帖子提到volatile關鍵字,但我沒有在您發佈的代碼中看到它。您需要確保Runvolatile boolean,以便它可以在主線程中更改,另一個線程將看到更改。

private volatile boolean Run=true; 

但我認爲這個問題是你這個Run僅在外部while循環測試。也許你也想在內部計數循環中使用它。喜歡的東西:

for(int i = 0; i < 1000 && Run; i++) { 

眼下,一旦循環開始計數,它必須完成之前檢查的Run布爾。未來可能會達到1000秒。

0

您的代碼在for循環中停留1000秒,直到它再次到達while(run)分支。我想這就是爲什麼它不能正常工作。

相關問題