我编写了一个多线程的客户端/服务器应用程序来处理多个连接。我有一个父类接受传入的连接,一个内部类接受接受的套接字并接收数据等。
我注意到虽然每个线程都在“完成”并且正在调用thread.join()
,但是分配给进程的内存随着每个连接而增长,并且永远不会缩小。
我认为我现在不能分享很多代码,但我有类似的东西试图结束线程。我也很肯定跑步方法正在完成。 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个线程并将它们分配给Connections更好的选择?因此,调用System.gc()
会减少内存负载,但这通常是不好的做法。
答案 0 :(得分:1)
有没有比预先声明~10个线程并将它们分配给Connections更好的选择?
不,这通常是好的想法,因为创建和销毁线程比重新使用它们要昂贵得多。这个想法被称为线程池,Java标准库已经为您实现了一个;查看java.util.concurrent.ThreadPoolExecutor的javadoc以及相关的类和接口。