这种情况下socket accept方法是否阻塞

Is the socket accept method blocking in this situation

只是一个简短而甜蜜的。我正在尝试制作一个聊天客户端,所以我有一个线程池来管理服务器上的套接字连接。如果我使用:

    while(true) {
        thrdPool.execute(new ServChatSocket(servSocket.accept(), InOutMan));
    }

是否会在接收到连接之前阻止 ServChatSocket 被创建并添加到池中,将一个奇怪的损坏 ServChatSocket 添加到池中并产生意外结果,或者抛出某种重复错误,直到它收到入站连接?

我是否应该在 while 块中使用 if 语句来检查在传递给 thrdPool 之前是否有准备好连接的对象?类似于:

    while(true) {
        if(s = servSocket.accept()) {
            thrdPool.execute(new ServChatSocket(s, InOutMan));
        }
    }

除了防止上述错误(如果有的话)之外,这会被认为是更好、更清晰的代码吗?

Will this block ServChatSocket's from being created and added to the pool until it receives a connection

是的。

add a weird broken ServChatSocket to the pool with unexpected results

没有

or throw some kind of repeated error until it receives an inbound connection?

没有

Should I use an if statement in the while block to check if there is an object ready to connect before passing to the thrdPool?

没有。 ServerSocket.accept() 从不 returns 空。

这是一个简单的求值顺序问题。

thrdPool.execute(new ServChatSocket(servSocket.accept(), InOutMan));

只是一个普通的函数调用。 Java 中没有魔法试图检测到当您编写此代码时,它与启动线程有关。不,execute() 方法的工作是在其内部启动线程,但那只是在其内部。

所以在这里,你用一个参数调用execute()。这个参数是:

new ServChatSocket(servSocket.accept(), InOutMan)

因此必须在调用 execute() 之前对其进行评估。

这是一个构造函数,它有两个参数,需要在调用构造函数之前对其求值。这些参数之一是

servSocket.accept()

这是一个阻塞的方法调用,直到客户端连接并接受套接字连接。

所以是的,它会阻塞。在准备好之前没有创建线程,没有错误。

On top of preventing aforementioned errors (if there are any) would this be considered better, cleaner code?

if() 只能计算布尔表达式,因此您的示例将不起作用。更重要的是,没有 if()。当您调用 accept() 时,您要么获得一个有效的 Socket 实例作为响应,要么您的程序在尝试时死掉并且在它死掉时没有代码执行。

但是您可能应该先调用 accept() ,将 Socket 存储在变量中,然后再执行 execute() 。就执行而言,这与将所有内容都放在一行中是一回事。但你问这些问题的事实表明,我们人类的大脑在理解和正确阅读这些线条方面有点挑战。你不是一个人。只是把顺序步骤分解成多条指令,简单明了。