2010-08-21 86 views
0

這是我正在使用的代碼。無法停止線程

public class timerApp { 
Runnable timerRun = new runX(); 
Thread thread1 = new Thread(timerRun); 
public static void main(String[] args) { 
    timerApp xyz = new timerApp(); 
    xyz.createGUI(); 
} 
public void createGUI() { 
    JButton button = new JButton("Start timer"); 
    JButton button2 = new JButton("Stop timer"); 
    JFrame frame = new JFrame(); 
    JLabel label = new JLabel("under_construction"); 
    frame.getContentPane().add(BorderLayout.NORTH,button); 
    frame.getContentPane().add(BorderLayout.SOUTH,button2); 
    frame.getContentPane().add(BorderLayout.CENTER,label); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(500,500); 
    frame.setVisible(true); 
    button.addActionListener(new b1L()); 
    button2.addActionListener(new b2L()); 
} 
public class b1L implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
     thread1.start(); 
    } 
} 
public class b2L implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
     thread1.stop(); 
    } 
    } 
} 

我得到一個錯誤Note: timerApp.java uses or overrides a deprecated API. Note: Recompile with Xlint:deprecation for details. 我開始加入了停止按鈕的監聽器類後得到這個。

RELP!

回答

3

你得到的線程的stop()方法已被棄用此警告。

爲什麼使用Thread.stop已過時?

因爲它本質上是不安全的。 停止線程會導致它解鎖所有已鎖定的監視器。 (作爲 ThreadDeath異常向上傳播 堆疊中的監視器解鎖)。如果任何先前由這些監視器 保護的對象 的是處於不一致的狀態,其他 線程現在可以 不一致的狀態中查看這些對象。據稱這些物體 被損壞。當線程 對損壞的對象進行操作時,可能導致任意的 行爲。這種行爲可能是微妙的並且難以檢測到,或者 可能會發音。與其他 未經檢查的異常不同,ThreadDeath 以靜默方式殺死線程;因此,用戶 沒有警告他的程序可能損壞了 。在發生實際的 損壞後,腐敗可以隨時顯示 本身,甚至在未來甚至可能是小時或天。

尼斯鏈接:

http://download.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

此鏈接提供的信息與您的問題:

  • 爲什麼使用Thread.stop已過時?
  • 我該用什麼來代替 Thread.stop?
  • 如何停止長時間等待 的線程(例如,用於輸入)?
  • 如果線程不響應 Thread.interrupt?

Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated?

5

首先,這不是一個錯誤。這是一個警告,您正在使用已棄用的方法。

Thread.stop()已被棄用。你可以閱讀這個here背後的基本原理。

基本上他們的說法是,有終止來自外部的線程沒有安全的方式;因此,你應該使用將很禮貌地詢問線程的唯一辦法阻止:

我應該用什麼來代替 使用Thread.stop?

大部分停止使用應該 通過簡單地 修改某些變量來表示 目標線程應該停止運行 代碼來代替。目標線程應 定期檢查該變量,並從一個 有序它的run方法 回報如果變量 表明它是停止運行。 (這是JavaSoft的 教程一直推薦的方式。)要 確保 停止請求的提示的通信,變量必須是 易失性(或接入到可變 必須同步)。

例如,假設你的applet 包含以下啓動,停止和 運行方式:

private Thread blinker; 

public void start() { 
    blinker = new Thread(this); 
    blinker.start(); 
} 

public void stop() { 
    blinker.stop(); // UNSAFE! 
} 

public void run() { 
    Thread thisThread = Thread.currentThread(); 
    while (true) { 
     try { 
      thisThread.sleep(interval); 
     } catch (InterruptedException e){ 
     } 
     repaint(); 
    } 
} 

您可以通過替換applet的停止避免使用使用Thread.stop 和運行 方法有:

private volatile Thread blinker; 

public void stop() { 
    blinker = null; 
} 

public void run() { 
    Thread thisThread = Thread.currentThread(); 
    while (blinker == thisThread) { 
     try { 
      thisThread.sleep(interval); 
     } catch (InterruptedException e){ 
     } 
     repaint(); 
    } 
} 
6

stop()確實已經過時了。它會使程序處於不一致的狀態。更好的方法是:

  1. Thread.interrupt()
  2. 設置一個布爾值,可見的線索,並獲得該線程檢查變量定期

關於如何安全地停止線程的詳細信息,請參見here

+2

+1表示使用什麼來代替'thread.stop()' – 2010-08-21 12:54:56