如何在Java中销毁一个线程

时间:2013-02-19 00:07:09

标签: java eclipse multithreading sockets runnable

我正在使用套接字在Java中编写客户端/服务器应用程序。在服务器中,我有一个接受客户端连接的线程,这个线程无限期地运行。在我的应用程序的某些时候,我想停止接受客户端连接,所以我想破坏该线程是唯一的方法。任何人都可以告诉我如何销毁线程吗?

这是我的代码:

class ClientConnectionThread implements Runnable {

    @Override
    public void run() {
        try {
            // Set up a server to listen at port 2901
            server = new ServerSocket(2901);

            // Keep on running and accept client connections
            while(true) {
                // Wait for a client to connect
                Socket client = server.accept();
                addClient(client.getInetAddress().getHostName(), client);

                // Start a new client reader thread for that socket
                new Thread(new ClientReaderThread(client)).start();
            }
        } catch (IOException e) {
            showError("Could not set up server on port 2901. Application will terminate now.");
            System.exit(0);
        }
    }
}

正如你所看到的那样,我有一个无限循环,而(true)在那里,所以这个线程永远不会停止,除非我以某种方式阻止它。

2 个答案:

答案 0 :(得分:3)

执行此操作的正确方法是关闭服务器套接字。这将导致accept()抛出您可以处理的IOException并退出该线程。

我添加了一个public void stop()方法,并将套接字作为该类中的一个字段。

private ServerSocket serverSocket;

public ClientConnectionThread() {
    this.serverSocket = new ServerSocket(2901);
}
...
public void stop() {
    serverSocket.close();
}
public void run() {
     while(true) {
         // this will throw when the socket is closed by the stop() method
         Socket client = server.accept();
         ...
     }
}

答案 1 :(得分:2)

一般情况下,你没有。你要求它使用Thread.interrupt()打断它正在做的事情。

为什么在Javadoc中有一个很好的解释。

从链接:

  

停止的大部分用法应该由只修改一些的代码替换   变量,表示目标线程应该停止运行。该   目标线程应定期检查此变量,并从中返回   如果变量指示它,则以有序的方式运行它的方法   是停止运行。 (这是Java Tutorial的方法   始终建议。)确保及时沟通   stop-request,变量必须是volatile(或访问变量)   必须同步)。

应该注意的是,在等待线程没有响应Thread.interrupt的所有情况下,它都不会响应Thread.stop

根据您的具体情况,您必须致电serverSocket.close,因为它不会回复Thread.interrupt