2011-12-27 70 views
1
public class thread extends Thread { 

    static volatile boolean done = false;// volatile keyword is used    

@Override 
public void run() { 
    while (!done) { 
     for (int i = 1; i < 10; i++) { 

      try { 
       thread.sleep(200); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.println(currentThread()); 
      System.out.println("1st thread>> " + i); 
     } 
    } 
} 

public static void main(String[] args) throws InterruptedException { 

    Thread th = new Thread(new thread(),"mythread"); 
    th.start(); 
    for (int i = 1; i < 10; i++) { 
     thread.sleep(400); 
     System.out.println(currentThread()); 
     System.out.println("2nd thread>> " + i); 
     if (i == 4) { 
      done = true;// safe way to stop a thread 
      break; 
     } 
    } 

    } 
    } 

我使用揮發性靜態變量here.Is它一個安全的方式來停止一個線程,也 當我打印currentThread()方法,我得到這樣的主題輸出[MyThread的, 5,主] 5和主要指什麼?安全的方式來停止一個線程在java中

+1

您在這裏提出兩個問題。 :-) – 2011-12-27 22:25:41

+0

大聲笑似乎我正在爲stackoverflow保存一些數據庫空間。我爲他們扮演祕密的聖誕老人;) – Nav 2011-12-27 22:31:21

+0

那麼,你的第二個問題是藏在底部,很可能被忽略或回答,另一個被忽略。 (例如,Eric Rosenburg的答案)爲了獲得更有針對性的答案,而不是浪費人們的時間(包括你自己的時間),下次你應該考慮提出兩個單獨的問題。數據庫空間便宜;時間不是。這只是不請自來(但希望有幫助)的建議,而不是譴責或批評。 – 2011-12-27 22:35:52

回答

4

這是一種安全的方法來停止線程,但沒有理由變量是靜態的:你想停止一個線程,而不是同一個類的所有線程。另外,有一個更標準,更脆弱的方法來阻止線程:中斷它。

public void run() { 
    while (!Thread.currentThread().isInterrupted() { 
     ... 
    } 
} 

... 

th.interrupt(); 

這具有額外的優點,即在睡覺或等待,或阻塞在可中斷IO方法的螺紋將與一個InterruptedException喚醒。當這種異常發生時,這意味着線程應該停止運行,所以你不應該像你那樣吞下異常。相反,您應該儘快從運行方法中返回:

try { 
    thread.sleep(200); 
} 
catch (InterruptedException e) { 
    return; 
} 
+0

實際上,我想在一個單獨的線程中構造一個加載表單將中斷方法的工作?我想知道關於利弊 – Nav 2011-12-27 22:33:54

+0

是的。使用isInterrupted檢查中斷狀態標誌,而不是檢查易失性標誌。 – 2011-12-27 22:35:49

+0

好的謝謝你JB :)我知道了,還有一件事我該如何使用java中的線程池中的線程。實際上,我使用線程池中的線程開發了一個類似的窗體加載窗體,並使用靜態變量來阻止它。它運行良好,然後認爲如果可以在java中執行相同的操作。 – Nav 2011-12-27 22:39:01

1

線程toString,當你做System.out.println(currentThread())打印線程名稱,優先級和線程組時,調用toString。

我假設你正在嘗試中斷其他一些正常完成的線程,那爲什麼不直接使用Thread.interrupt()和Thread.isInterrupted()?

+0

謝謝你的回答,也是使用volatile變量來安全停止線程的一種安全方法。如果有另一種更安全的方式,請讓我知道:) – Nav 2011-12-27 22:27:27

+0

5是優先級,主要是線程組 – 2011-12-27 22:28:26