无法停止线程

时间:2010-08-21 09:55:12

标签: java

这是我正在使用的代码。

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 个答案:

答案 0 :(得分:6)

stop()确实已被弃用。它会使程序处于不一致状态。更好的方法是:

  1. Thread.interrupt()
  2. 在线程中设置一个布尔值,并让该线程定期检查该变量
  3. 有关如何安全停止线程的更多详细信息,请参阅here

答案 1 :(得分:5)

首先,这不是错误。这是一个警告,你正在使用一种弃用的方法。

Thread.stop()已弃用。您可以阅读此here背后的基本原理。

基本上他们的论点是没有安全的方法从外部终止线程;因此,你应该使用的唯一方法是礼貌地要求线程停止:

  

我应该使用什么而不是   使用Thread.stop吗

     

停止的大多数用途应该   简单地用代码替换   修改一些变量来表示   目标线程应该停止   运行。目标线程应该   定期检查这个变量,和   从它的run方法返回   如果变量有序时尚   表示它将停止运行。   (这是JavaSoft的方法   教程一直推荐。)To   确保及时沟通   停止请求,变量必须是   volatile(或访问变量   必须同步)。

     

例如,假设您的小程序   包含以下开始,停止和   运行方法:

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();
    }
}
     

您可以避免使用Thread.stop   通过替换applet的停止并运行   方法:

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();
    }
}

答案 2 :(得分:3)

您收到此警告,因为不推荐使用Thread的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?