Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程:自动终止_Java_Multithreading_Sockets_Client - Fatal编程技术网

Java线程:自动终止

Java线程:自动终止,java,multithreading,sockets,client,Java,Multithreading,Sockets,Client,我想知道这个线程是否引用了正在创建的代码片段,一旦完成任务,它将在垃圾收集中自动终止 我正在创建一个基本的聊天程序来学习如何使用套接字、创建客户端和服务器。我很快发现,如果我想能够发送和接收来自客户端的消息,而不是只在发送时更新,我需要对客户端执行多线程。一个线程用于接收消息和更新我的GUI,另一个线程用于发送。我有下面的代码片段,每当聊天室GUI上的按钮触发ActionEvent时,就会调用它。当我注意到每次我发送一条消息时,都会创建一个按顺序编号更高的线程时,我开始担心。我担心之前的线程没有

我想知道这个线程是否引用了正在创建的代码片段,一旦完成任务,它将在垃圾收集中自动终止

我正在创建一个基本的聊天程序来学习如何使用套接字、创建客户端和服务器。我很快发现,如果我想能够发送和接收来自客户端的消息,而不是只在发送时更新,我需要对客户端执行多线程。一个线程用于接收消息和更新我的GUI,另一个线程用于发送。我有下面的代码片段,每当聊天室GUI上的按钮触发ActionEvent时,就会调用它。当我注意到每次我发送一条消息时,都会创建一个按顺序编号更高的线程时,我开始担心。我担心之前的线程没有被正确删除,并且仍然在内存中,因此数字会更高

代码:


在run方法返回后,该线程将终止并最终被垃圾回收。您会看到id号不断增加,因为您正在为每个此类操作启动新线程—这不是建议的体系结构,但确实有效。

为什么每次客户端希望发送消息时都要创建新线程?这样的客户端需要几个线程,但它们应该在程序运行期间运行,并从内部队列中添加和删除消息。我建议您阅读一些关于Java并发性的文章,比如,如果您不介意的话,为什么不建议这样做?另外,感谢您的快速回答:旋转线程会有很多开销。您通常要做的是启动一个线程来“侦听”队列。当队列中有东西时,它会处理它并返回到侦听。这样就避免了线程启动开销。此外,知道哪个线程正在执行工作也很简单!
public void send(String message)
{
    //Create a new thread so that the client can receive messages while it's sending them.
    Thread thread = new Thread(new Runnable()
    {
        /* (non-Javadoc)
         * @see java.lang.Runnable#run()
         */
        @Override
        public void run()
        {
            try
            {
                System.out.println("Writing chars");
                output.writeUTF(message);
            } catch (IOException exception)
            {
                System.out.println("Error attempting to write: " + message + " to the server.");
                exception.printStackTrace();
            }   
        }
    });
    thread.start();
}