Я читаю книгу «мышление в java» (Fouth Edition) и задаю вопрос о параллелизме исходного кода/CloseResource.java. Когда метод socketInput.close()
генерирует исключение InterruptedException, поток, который inputStream имеет значение socketInput, может нормально завершаться, однако другой поток, который inputStream является System.in, не может выйти. Программа не может выйти.«Думая на Java» параллелизм CloseResource.java
Не могли бы вы дать мне повод по этому поводу.
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 в main() после его закрытия? Если он действительно закрылся, он должен выбросить исключение IOException. Если close() никогда не заканчивается, вы никогда не достигнете этой линии. – cogsmos
Если вы отлаживаете эту программу, вы обнаружите, что достигнут system.in.close(). –