【发布时间】:2019-03-21 11:14:20
【问题描述】:
我正在阅读《Java 网络第 4 版》和第 9 章关于服务器套接字的书,同时解释了多线程服务器,其中每个客户端都使用单线程处理,它说如下:
示例 9-3 故意不对服务器接受的客户端套接字使用 try-with-resources 插座。这是因为客户端套接字从 try 块逃逸到单独的线程中。 如果您使用 try-with-resources,主线程将在收到套接字后立即关闭 到 while 循环结束,可能是在派生线程完成使用它之前。
这里是示例 9-3
import java.net.*;
import java.io.*;
import java.util.Date;
public class MultithreadedDaytimeServer {
public final static int PORT = 13;
public static void main(String[] args) {
try (ServerSocket server = new ServerSocket(PORT)) {
while (true) {
try {
Socket connection = server.accept();
Thread task = new DaytimeThread(connection);
task.start();
} catch (IOException ex) {}
}
} catch (IOException ex) {
System.err.println("Couldn't start server");
}
}
private static class DaytimeThread extends Thread {
private Socket connection;
DaytimeThread(Socket connection) {
this.connection = connection;
}
@Override
public void run() {
try {
Writer out = new OutputStreamWriter(connection.getOutputStream());
Date now = new Date();
out.write(now.toString() +"\r\n");
out.flush();
} catch (IOException ex) {
System.err.println(ex);
} finally {
try {
connection.close();
} catch (IOException e) {
// ignore;
}
}
}
}
}
我真的不明白为什么会发生这种情况,为什么主线程要关闭另一个线程的套接字,是因为套接字对象是在主线程中创建的,并且引用是在线程构造函数中提供的?
【问题讨论】:
标签: java multithreading sockets