线程:如何从该线程外部中断线程

时间:2014-05-19 06:57:57

标签: java multithreading thread-safety interrupt

我有一个简单的GUI,其中有两个按钮:PrintStop

当用户按下print时,已经保存的号码连续打印

当用户按下Stop时,打印停止

我在一个单独的线程中处理数字的打印,因为我需要线程在再次打印之前休眠一毫秒。

printBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                Thread a= new Thread(new Runnable(){
                    public void run(){
                        textArea.setText("");
                        for (int i=0; i<10; i++){
                            int result= 0;
                            System.out.println(result+"\n"); 
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            } 
                        }
                    }
                });
                a.start();
            }
        });

现在在Stop按钮的ActionListener中,我希望第一个线程被中断或停止。 我该怎么做,因为它需要从另一个线程中断?< /强>

3 个答案:

答案 0 :(得分:1)

如果您的第一个线程不包含线程阻塞操作,您可以检查for - 循环中的标志,当您按下&#34;停止&#时,该标志将设置为true 34; - 按钮

public class WriterThread implements Runnable {

    private volatile boolean stopped = false;

    public synchronized void stop() {
        this.stopped = true;
    }

    public void run(){
            textArea.setText("");

            for (int i=0; i<10; i++) {
                    if (this.stopped) {
                            break;
                    }

                    int result= 0;
                    System.out.println(result+"\n");

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } 
                }
            }
        }
    }
}

答案 1 :(得分:1)

使用AtomicBoolean作为标记。它将确保线程安全。

Runnable r= new Runnable(){

    private AtomicBoolean stop= new AtomicBoolean(false);

    public void run(){
        for(...){

           if(stop.get()){
               break; // break the loop
           }

           ...

        }
    }

    public stop(){
        stop.set(true);
    }
}

Thread a= new Thread(r);
a.start();
r.stop();

答案 2 :(得分:1)

final Thread a= new Thread(new Runnable(){
    public void run(){
        try {
            textArea.setText("");
            for (int i=0; i<10; i++){
                int result= 0;
                System.out.println(result+"\n"); 
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            // ignore
        } 
    }
});

printBtn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {

        a.start();
    }
});

stopBtn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {

       if( a.isAlive() ) {   
           a.interrupt();
       }
    }
});