java 循环中的线程联接,其中多个客户端可以连接到服务器

ijxebb2r  于 2023-04-28  发布在  Java
关注(0)|答案(2)|浏览(113)

在多个客户端可以连接到一个服务器的程序中,使用join是个好主意吗?例如:

while(true)
{
    Socket clientSocket = serverSocket.accept();

    //thread creation for new clients, followed by executing their (generally overwritten) `run()` method.
    thread.join();
}

现在,我的理解是,如果线程是join艾德,那么新客户端将不得不等待客户端完成预期的操作-这不应该发生,因为多个客户端应该能够同时连接和操作。
那么,以这种方式使用join是一个好主意吗?

g6baxovj

g6baxovj1#

不,在这样的循环中执行thread.join()不是一个好主意。
thread.join()将导致当前线程进入等待状态,直到变量thread引用的线程结束。因此,循环将挂在那里。不接受新套接字。
在接受套接字之后,应该创建一个新线程,并且套接字应该被移交给新线程进行进一步处理。一旦接受了套接字并创建了ClientSocket,就会从积压队列中删除连接请求。如果该循环进入等待状态,则积压队列也将被填满,并且连接请求也可能被拒绝。
接受新连接的当前线程应该继续,所以它不应该使用join。它应该创建一个新线程,并尽快继续接受新的连接请求,以便积压队列在大多数时间内也保持相对空。
只有当服务器正在关闭时,循环才应该中断(不接受新连接),然后在循环之外,它可以等待正在运行的线程完成(完成与已经连接的客户端的通信),然后退出。

yizd12fk

yizd12fk2#

启动一个新线程然后立即join它是没有任何意义的。创建一个新线程的目的是让新线程可以做它的事情,而调用者 * 并发 * 做一些其他事情:

Runnable r = ...;
Thread t = new Thread(r);
t.start();
doSomeOtherThingConcurrentlyWithTheNewThread();
t.join();

如果调用者不想做其他事情,那么就没有理由创建新线程。你可以通过这样做来保存一些CPU周期,它会有完全相同的效果:

Runnable r = ...;
r.run();

相关问题