【问题标题】:Java Threads: Automatic TerminationJava 线程:自动终止
【发布时间】:2016-01-13 22:25:21
【问题描述】:

我想知道正在创建的这个线程(参考代码 sn-p)是否会在完成工作后在垃圾回收中自动终止。

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

代码:

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();
}

【问题讨论】:

  • 为什么每次客户端要发送消息时都创建一个新线程?对于这样的客户端,您需要多个线程,但它们应该在程序运行期间运行并在内部队列中添加和删除消息。
  • 您可能想要使用一些队列,例如。 BlockingQueue。我建议您阅读有关 Java 并发的一般知识,例如 Java Concurrency Tutorial by Jenkov

标签: java multithreading sockets client


【解决方案1】:

在您的run() 方法返回后,Thread 将终止并最终被垃圾回收。您会看到递增的 id 编号,因为您正在为每个此类操作启动新线程 - 这不是建议的架构,但确实有效。

【讨论】:

  • 如果您不介意我问,为什么不建议这样做?另外,感谢您的快速回答:)
  • 启动线程有很多开销。你通常做的是启动一个线程来“监听”一个队列。当队列中有东西时,它会处理它并返回监听。这样就避免了线程启动开销。此外,知道哪个线程在做这项工作是微不足道的!
猜你喜欢
  • 2014-11-18
  • 2020-11-19
  • 2012-08-28
  • 2015-12-21
  • 2011-08-11
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
相关资源
最近更新 更多