gpt4 book ai didi

Java 线程/可运行停止

转载 作者:行者123 更新时间:2023-12-01 11:38:28 24 4
gpt4 key购买 nike

我编写了一个多线程客户端/服务器应用程序来处理多个连接。我有一个接受传入连接的父类,以及一个接受接受的套接字并接收数据等的内部类。

我注意到,虽然每个线程都在“完成”并且正在调用 thread.join(),但分配给进程的内存随着每个连接而增长,并且永远不会收缩。

我认为我现在无法共享很多代码,但我有类似的东西来尝试结束线程。我也确信 run 方法正在完成。 ThreadHandler 是一个包含 Thread 及其 Runnable 的内部类。 IsRunning() 将在 run() 完成后返回 true。

private static void cleanupThreads(ArrayList<ThreadHandler> threads){

//find all of the non-running threads and join them

for(int i = 0; i < threads.size(); i++){

//get the Handler and check whether it's running
ThreadHandler tmpThread = threads.get(i);
Handler tmpHandler = tmpThread.getHandler();
if(!tmpHandler.isRunning()){
//time to die
threads.remove(i);
try{
tmpThread.getThread().join();
System.out.println("thread joined");
}catch(InterruptedException e){

}
}
}
}

是否有比预先声明约 10 个线程并在连接出现时将它们分配给它们更好的选择?事实上,调用 System.gc() 会减少内存负载,但这通常是不好的做法。

最佳答案

Is there a better option than pre-declaring ~10 threads and assigning them to Connections as they come?

不,这通常是一个主意,因为创建和销毁线程比重新使用它们要昂贵得多。这个想法称为“线程池”,Java 标准库已经为您实现了一个;查看 java.util.concurrent.ThreadPoolExecutor 以及相关类和接口(interface)的 javadoc。

关于Java 线程/可运行停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29756358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com