只是一个简短而甜蜜的人。我正在尝试创建一个聊天客户端,所以我有一个线程池来管理服务器上的套接字连接。如果我使用:
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));
}
}
除了防止上述错误(如果有的话)之外,这会被认为是更好,更清晰的代码吗?
答案 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存储在变量中,然后执行()。在执行方面,与将所有内容放在一行中相同。但是,你提出这些问题的事实表明,我们的人类大脑在理解这些线条并正确阅读它们时会遇到一些挑战。你并不孤单。只需更清楚地分解多个指令中的顺序步骤。