中断后{Java}线程处于活动状态

时间:2017-10-01 21:48:18

标签: java multithreading sockets

我正在从main函数为这个类创建一个Thread,但即使在使用Thread.currentThread()中断它之后.insert()输出仍然包含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的新手,我想改进任何建议?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

根据建议,return将完成run()的执行。如果你想首先检查线程是否被中断(由另一个线程),你可以这样做:

if (Thread.currentThread().isInterrupted()) {
     return;
  }
相关问题