gpt4 book ai didi

java - "Thinking In Java"并发CloseResource.java

转载 作者:行者123 更新时间:2023-12-01 04:40:52 31 4
gpt4 key购买 nike

我正在看《thinking In java》(第四版)这本书,发现一个关于源代码 concurrency/CloseResource.java 的问题。当socketInput.close()方法抛出InterruptedException时,inputStream为socketInput的线程可以正常终止,但inputStream为System.in的另一个线程无法退出。程序无法退出。

你能给我一些理由吗?

    class IOBlocked implements Runnable{
private InputStream in ;
public IOBlocked(InputStream is){
in=is;
}
public void run(){
try{
System.out.println("Waiting for read():");
in.read();
}catch(IOException e){
if(Thread.currentThread().isInterrupted()){
System.out.println("Interrupted from blocked I/O");

}else{
throw new RuntimeException(e);
}
}
System.out.println("Exiting IOBlocked.run()");
}
}

public class CloseResource {
public static void main(String[] args) throws IOException, InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
ServerSocket server = new ServerSocket(8080);
InputStream socketInput =
new Socket("localhost", 8080).getInputStream();
exec.execute(new IOBlocked(socketInput));
exec.execute(new IOBlocked(System.in));
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("Shutting down all threads");
exec.shutdownNow();
TimeUnit.SECONDS.sleep(1);
System.out.println("Closing " + socketInput.getClass().getName());
socketInput.close(); // Releases blocked thread
TimeUnit.SECONDS.sleep(1);
System.out.println("Closing " + System.in.getClass().getName());
System.in.close(); // Releases blocked thread
}
}

最佳答案

它可能在 System.in.close(); 上被阻止 - 如果您在该行之后添加打印语句,您可能会看到它永远不会到达。

这可能是因为您从 IDE 运行它,而 IDE 不允许您关闭控制台输入。

如果您从命令行运行它,它应该可以正常工作。

关于java - "Thinking In Java"并发CloseResource.java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16577501/

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