2013-05-16 3 views
1

Я читаю книгу «мышление в 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 
} 
} 
+0

Является ли ресурс когда-либо закрывающим? Если вы попытаетесь прочитать для чтения из System.in в main() после его закрытия? Если он действительно закрылся, он должен выбросить исключение IOException. Если close() никогда не заканчивается, вы никогда не достигнете этой линии. – cogsmos

+0

Если вы отлаживаете эту программу, вы обнаружите, что достигнут system.in.close(). –

ответ

0

Это, вероятно, блокируется на System.in.close(); - если добавить оператор печати после этой строки вы, вероятно, увидеть его никогда не достигается.

Возможно, это связано с тем, что вы запускаете его из своей IDE, что не позволяет закрыть вход в консоль.

Если вы запустите его из командной строки, он должен работать нормально.

Смежные вопросы