停止正在运行的线程

时间:2014-01-16 14:36:43

标签: java multithreading

public class Threadsample implements ActionListener {
HelloRunner hr = new HelloRunner();
Thread tr1 = new Thread(hr, "ThreadOne");
public void actionPerformed(ActionEvent ae)
    {

        Object source = ae.getSource();
        if (source == b2){
            hr.stopRunning();
        }
        if (source== b1){

            tr1.start();
        }
    }


    public class HelloRunner implements Runnable
    {
        private volatile boolean timeToQuit=false;
        int i = 0;
        public void run(){
            while ( ! timeToQuit ){
                  System.Out.Println(i);
                  i++
            }
        }
        public void stopRunning() {
             timeToQuit=true;
             }
    }
}

如何停止正在运行的线程?

4 个答案:

答案 0 :(得分:1)

线程中断是要走的路:

// computingThread computing here
    while (!Thread.currentThread.isInterrupted()){
      System.Out.Println(i);
      i++;
    }


//.... in other part of your program, your main thread for instance:    
    public void stopComptuterThread() {
      computingThread.interrupt();   // assuming computingThread reference reachable
    }

的确,有些人会使用Thread.stop()方法.. =>这就是为什么它会非常糟糕:https://www.securecoding.cert.org/confluence/display/java/THI05-J.+Do+not+use+Thread.stop()+to+terminate+threads

答案 1 :(得分:0)

不推荐使用Thread.stop,不应使用它。 示例代码在这里: pause-and-resume-thread

答案 2 :(得分:0)

你的代码会做。您可以使用内置中断方法,该方法大致相同,但如果它休眠/等待,也会使用InterruptedException唤醒线程。很高兴知道Java不允许以“艰难的方式”停止线程(除了在线程上使用.stop()方法,不推荐使用。)

总的来说,过程看起来如下:

  • 用户通过设置一个标志(你的情况)或通过调用.interrupt()方法来请求线程停止,该方法设置标志.interrupted()和“shakes”线程如果它正在睡觉就醒来/等待。

  • 阻止它执行的线程无关紧要。如果你没有实现一些逻辑处理中断标志,那么线程就无法对试图中断它的外部线程作出反应,并且在JVM结束执行后会死掉。

答案 3 :(得分:0)

您确定,这是线程问题吗?您是否检查过.actionPerformed是否实际调用.stopRunning方法?

无论如何,请尝试以下代码示例。它适用于100%。

class HelloRunner implements Runnable {
    private volatile boolean timeToQuit = false;
    int i = 0;

    public void run() {
        while (!timeToQuit) {
            System.out.println(i);
            i++;
        }
    }

    public void stopRunning() {
        timeToQuit = true;
    }
}

public class MainRunner {
    public static void main(String[] args) throws InterruptedException {
        HelloRunner hr = new HelloRunner();
        Thread tr1 = new Thread(hr, "ThreadOne");

        tr1.start();
        Thread.sleep(100);
        hr.stopRunning();
    }
}