Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在这种情况下套接字接受方法是否阻塞_Java_Sockets_Threadpool - Fatal编程技术网

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

Java 在这种情况下套接字接受方法是否阻塞,java,sockets,threadpool,Java,Sockets,Threadpool,只是一个又短又甜的。我正在尝试创建一个聊天客户端,因此我有一个线程池来管理服务器上的套接字连接。如果我使用: while(true) { thrdPool.execute(new ServChatSocket(servSocket.accept(), InOutMan)); } 在接收到连接之前,是否会阻止ServChatSocket被创建并添加到池中,是否会向池中添加一个异常中断的ServChatSocket,是否会在接收到入站连接之前抛出某种重复错误 我是否

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

    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));
        }
    }
在防止上述错误(如果有)的基础上,这会被认为是更好、更干净的代码吗

在收到连接之前,是否会阻止ServChatSocket的创建和添加到池中

向池中添加异常损坏的ServChatSocket,并产生意外结果

没有

或者抛出某种重复错误,直到收到入站连接

没有

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

否。
ServerSocket.accept()
从不返回null

在收到连接之前,是否会阻止ServChatSocket的创建和添加到池中

向池中添加异常损坏的ServChatSocket,并产生意外结果

没有

或者抛出某种重复错误,直到收到入站连接

没有

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


否。
ServerSocket.accept()
从不返回null。

这是一个简单的计算顺序问题

thrdPool.execute(new ServChatSocket(servSocket.accept(), InOutMan));
只是一个普通的函数调用。Java内部并没有神奇之处,它试图检测到,当您编写此代码时,它与启动线程有关。不,execute()方法的任务是在自身内部启动线程,但这只是在自身内部

在这里,使用参数调用execute()。此参数为:

new ServChatSocket(servSocket.accept(), InOutMan)
因此,必须先对其求值,然后才能调用execute()

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

servSocket.accept()
这是一种方法调用,在客户端连接并接受套接字连接之前一直阻塞

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

除了防止上述错误(如果有)之外 这是更好、更干净的代码吗

if()只能对布尔表达式求值,因此您的示例将不起作用。更重要的是,没有if()。当您调用accept()时,要么您在响应中获得了一个有效的套接字实例,要么您的程序在尝试时停止,并且在停止时没有代码执行


但是您可能应该首先调用accept(),将套接字存储在变量中,然后执行()。就执行而言,这与将所有内容放在一行是一样的。但你问这些问题的事实表明,我们的大脑在理解和正确阅读这些句子方面有点困难。你并不孤单。将顺序步骤分解为多条指令更为清晰。

这是一个简单的计算顺序问题

thrdPool.execute(new ServChatSocket(servSocket.accept(), InOutMan));
只是一个普通的函数调用。Java内部并没有神奇之处,它试图检测到,当您编写此代码时,它与启动线程有关。不,execute()方法的任务是在自身内部启动线程,但这只是在自身内部

在这里,使用参数调用execute()。此参数为:

new ServChatSocket(servSocket.accept(), InOutMan)
因此,必须先对其求值,然后才能调用execute()

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

servSocket.accept()
这是一种方法调用,在客户端连接并接受套接字连接之前一直阻塞

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

除了防止上述错误(如果有)之外 这是更好、更干净的代码吗

if()只能对布尔表达式求值,因此您的示例将不起作用。更重要的是,没有if()。当您调用accept()时,要么您在响应中获得了一个有效的套接字实例,要么您的程序在尝试时停止,并且在停止时没有代码执行

但是您可能应该首先调用accept(),将套接字存储在变量中,然后执行()。就执行而言,这与将所有内容放在一行是一样的。但你问这些问题的事实表明,我们的大脑在理解和正确阅读这些句子方面有点困难。你并不孤单。在多个指令中分解顺序步骤更简单