在多个客户端可以连接到一个服务器的程序中,使用join
是个好主意吗?例如:
while(true)
{
Socket clientSocket = serverSocket.accept();
//thread creation for new clients, followed by executing their (generally overwritten) `run()` method.
thread.join();
}
现在,我的理解是,如果线程是join
艾德,那么新客户端将不得不等待客户端完成预期的操作-这不应该发生,因为多个客户端应该能够同时连接和操作。
那么,以这种方式使用join
是一个好主意吗?
2条答案
按热度按时间g6baxovj1#
不,在这样的循环中执行
thread.join()
不是一个好主意。thread.join()
将导致当前线程进入等待状态,直到变量thread
引用的线程结束。因此,循环将挂在那里。不接受新套接字。在接受套接字之后,应该创建一个新线程,并且套接字应该被移交给新线程进行进一步处理。一旦接受了套接字并创建了ClientSocket,就会从积压队列中删除连接请求。如果该循环进入等待状态,则积压队列也将被填满,并且连接请求也可能被拒绝。
接受新连接的当前线程应该继续,所以它不应该使用
join
。它应该创建一个新线程,并尽快继续接受新的连接请求,以便积压队列在大多数时间内也保持相对空。只有当服务器正在关闭时,循环才应该中断(不接受新连接),然后在循环之外,它可以等待正在运行的线程完成(完成与已经连接的客户端的通信),然后退出。
yizd12fk2#
启动一个新线程然后立即
join
它是没有任何意义的。创建一个新线程的目的是让新线程可以做它的事情,而调用者 * 并发 * 做一些其他事情:如果调用者不想做其他事情,那么就没有理由创建新线程。你可以通过这样做来保存一些CPU周期,它会有完全相同的效果: