gpt4 book ai didi

java - 需要有关 java 中 ExecutorService 的建议

转载 作者:太空宇宙 更新时间:2023-11-04 08:05:11 25 4
gpt4 key购买 nike

嘿,所以我为 ExecutorService 的 java 文档选择了这个示例。我想确认这段代码的流程,Executors.newFixedThreadPool 将创建一个线程池(我猜)。所以serversocket将等待连接,一旦获得连接,它就会启动一个线程,所以现在池大小减少1。一旦线程完成执行,池大小将再次增加1,不是吗?线程会放弃它使用的资源吗?

class NetworkService implements Runnable {
private final ServerSocket serverSocket;
private final ExecutorService pool;

public NetworkService(int port, int poolSize)
throws IOException {
serverSocket = new ServerSocket(port);
pool = Executors.newFixedThreadPool(poolSize);
}

public void run() { // run the service
try {
for (;;) {
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
}

class Handler implements Runnable {
private final Socket socket;
Handler(Socket socket) { this.socket = socket; }
public void run() {
// read and service request on socket
}
}

最佳答案

Once the thread finishes execution, the poolsize will again increment by 1, wont it?

是的。该线程将去获取并运行下一个Handler

Will the thread give up the resources it used?

不是立即,不。一旦 Handler run() 方法完成,Handler 将超出范围。但是,您必须等待垃圾收集器运行才能释放 Handler 实例。这将依次释放Socket,然后它本身就会成为垃圾回收的候选对象。

如果您希望 Socket 更快地释放(我认为这是问题所在),那么应该在 run() 方法的末尾完成。您可以在 finally block 中调用 socket.close() (并且可能将 socket 设置为 null)。建议使用类似以下内容:

class Handler implements Runnable {
...
public void run() {
try {
// read and service request on socket
} finally {
// make sure we close the socket when the handler is finishing
socket.close();
}
}
}

关于java - 需要有关 java 中 ExecutorService 的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12184421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com