在这种情况下,套接字接受方法是否阻塞

时间:2018-05-24 22:24:45

标签: java sockets threadpool

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

    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));
        }
    }

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

2 个答案:

答案 0 :(得分:2)

  

这是否会阻止ServChatSocket被创建并添加到池中,直到它收到连接

  

将一个奇怪的ServChatSocket添加到池中并产生意外结果

没有

  

或者在收到入站连接之前会抛出某种重复错误?

没有

  

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

没有。 ServerSocket.accept()永远不会返回null。

答案 1 :(得分:1)

这是一个简单的评估顺序。

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

只是正常的函数调用。 Java中没有任何魔法试图在你编写它时检测到它,它与启动线程有关。不,execute()方法的工作是在自身内部启动线程,但这只是在自身内部。

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

new ServChatSocket(servSocket.accept(), InOutMan)

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

它是一个构造函数,在调用构造函数之前需要对两个参数进行求值。其中一个参数是

servSocket.accept()

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

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

  

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

if()只能评估布尔表达式,所以你的例子不会起作用。更重要的是,没有if()。当你调用accept()时,要么你得到一个有效的Socket实例作为响应,要么你的程序死了,并且当它已经死了没有代码执行。

但是你应该首先调用accept(),将Socket存储在变量中,然后执行()。在执行方面,与将所有内容放在一行中相同。但是,你提出这些问题的事实表明,我们的人类大脑在理解这些线条并正确阅读它们时会遇到一些挑战。你并不孤单。只需更清楚地分解多个指令中的顺序步骤。