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