java - 如何中断/停止 Java 中的线程?

标签 java multithreading

我正试图停止一个线程,但我做不到:

public class Middleware {

public void read() {
    try {
        socket = new Socket("192.168.1.8", 2001);

        // code .. 

        Scan scan = new Scan();
        thread = new Thread(scan);
        thread.start();

    } catch (UnknownHostException ex) {
        ex.printStackTrace();

    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

class Scan extends Thread {

    public void run() {

        while (true) {
            try {
            // my code goes here

            } catch (IOException ex) {
                thread.currentThread().interrupt();
            }
        }
    }
}

public void stop() {
    Thread.currentThread().interrupt();
}

// get and setters
}

因此,即使我调用“停止”方法,线程也不会停止。 它保持活力。

我怎样才能中断/停止这个线程?

更新 (@小方法)

private void tb_startActionPerformed(java.awt.event.ActionEvent evt) {                                         
    Middleware middleware = new Middleware();

    if (tb_start.getText().equals("Start")){
        tb_start.setText("Stop");

        // starting to read rfid tags
        middleware.read();
    }else{
        tb_start.setText("Start");

        // stop reading rfid tags
        middleware.stop();
    }
}

中间件类:

public class Middleware {

    private Scan scan;

    public void read() {

        scan = new Scan();
        scan.start();
    }

    private class Scan extends Thread {

        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("reading...");
            }
        }
    }

    public void stop() {
        if (scan != null) {
            scan.interrupt();
        }
    }
}

但是当我试图停止线程时,它并没有停止。

上面的代码有什么问题?

最佳答案

您真的没有理由需要使用 volatile 标志。相反,只需使用 isInterrupted() 查询线程的状态即可。 .另外,为什么要将 Scan 线程对象包装在另一个线程对象中?这对我来说似乎完全没有必要。

这是你应该做的事情

public class Middleware {
    private Scan scan;

    public void read() {
        try {
            // do stuff

            scan = new Scan();
            scan.start();
        } catch (UnknownHostException ex) {
            // handle exception
        } catch (IOException ex) {
            // handle exception
        }
    }

    private class Scan extends Thread {

        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    // my code goes here
                } catch (IOException ex) {
                    Thread.currentThread().interrupt();
                }
            }
        }
    }

    public void stop() {
        if(scan != null){
            scan.interrupt();
        }
    }
}

这是一个 example .另外,我不建议扩展 Thread

关于java - 如何中断/停止 Java 中的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6599202/

相关文章:

java - 在java中将数据从标准输出写入文本文件不起作用

java - 在使用时覆盖 jar - Java

java - 通过java中的套接字从服务器请求特定文件

java - Google 客户端登录处理 AuthToken

C# 线程中断停止工作

ios - 在 Objective-C 中连续执行循环迭代

java - 在存在另一个可聚焦组件的情况下,AWT Canvas 无法获得焦点

C# - 作为执行异步任务的委托(delegate),我仍然需要 System.Threading 吗?

c++ - boost condition_variable 等待多个锁

c++ - 如何判断一个函数是否被多个线程调用