Java线程中断后处于 Activity 状态

标签 java multithreading sockets

我正在从主函数为此类创建一个线程,但即使使用 Thread.currentThread().interrupt() 中断它,输出仍然包含“Still Here”行。

public class WriteToServer extends Thread {

    private DataOutputStream writeMessage;

    private String clientName;

    public WriteToServer(Socket socket, String clientName) {
        try {
            this.writeMessage = new DataOutputStream(socket.getOutputStream());
            this.clientName = clientName;
        } catch(Exception e) {
            System.err.println(e);

            Thread.currentThread().interrupt();
        }
    }

    public void run() {
        try {
            Scanner scanner = new Scanner(System.in);
            String message = scanner.nextLine();

            while (!message.equalsIgnoreCase("quit")) {
                writeMessage.writeUTF(clientName + ":" + message);
                message = scanner.nextLine();
            }

            writeMessage.writeUTF(message);
            writeMessage.close();

            Thread.currentThread().interrupt();

            System.out.println("Still Here");
        } catch(Exception e) {
            System.err.println(e);

            Thread.currentThread().interrupt();
        }
    }
}

我是 Java 新手,我想改进,有什么建议吗?

最佳答案

在 Java 中没有合法方法可以立即停止线程执行。调用Thread#interrupt()只是将线程上的interrupted标志设置为true。作为程序员,您有责任检查代码中的中断标志并正确关闭线程 Activity 。

在您的示例中,您只需编写一个 return 语句即可完成 run() 方法的执行。

有关更多信息,请查看下一篇文章:https://www.javaworld.com/article/2077138/java-concurrency/introduction-to-java-threads.html

关于Java线程中断后处于 Activity 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46517219/

相关文章:

Azure ApiApp 中的 Java 日志记录

java - Java 作用域中的异步 lambda 如何处理局部变量

c# - 如何更新 WPF MainWindow 上的控件

java - 运行不会停止

.net - 如何将 C++/CLI .Net 套接字转换为 boost::asio 套接字?

java - 使用ajax在不同面板中的 Wicket 口刷新listView

java - 在 Libgdx 中创建另一个纹理时,我应该调用 dispose() 纹理吗?

java - 有一个带有文件夹路径的字符串,如何将其转换为文件以便能够使用 getDesktop.open() 打开它?

java - 在一个SSL套接字连接中使用两个私钥( keystore )和两个公钥(信任库)

node.js - 与 Node 的 SMTP 连接