perché blocca inputstream.close () di java?
-
22-07-2019 - |
Domanda
Il mio programma Java utilizza ProcessBuilder (con redirectErrorStream impostato su true) e ha un ciclo che esegue il metodo di lettura del flusso di input del processo, che sta bloccando. Il programma esterno che sto chiamando si ferma quindi in attesa di input e stdin. Ora voglio terminare il processo. Ciò non viene fatto chiamando (in un thread separato) il metodo di distruzione del processo e chiamando il metodo di chiusura dell'inputstream per impedire più il blocco del metodo di lettura, in modo che il mio thread iniziale possa finire la sua vita?
Per qualche motivo blocchi process.getInputStream (). close ()
. Da JavaDoc non vedo perché questo possa accadere. Inoltre, non capisco perché javadoc dice "Il metodo di chiusura di InputStream non fa nulla." ( link a javadoc ) Qualcuno potrebbe spiegarlo?
Grazie :-)
Soluzione
Per quanto riguarda il comportamento di blocco, esiste un problema noto in Java che può causare deadlock durante la comunicazione con un altro processo. Non so dire se questo è quello che stai vedendo ma vale la pena esaminarlo. Il documento per java.lang.Process dice:
Perché solo alcune piattaforme native fornire dimensioni del buffer limitate per flussi di input e output standard, impossibile scrivere prontamente l'input flusso o leggere il flusso di output di il sottoprocesso può causare il sottoprocesso da bloccare e anche situazione di stallo.
Altri suggerimenti
Per qualche motivo process.getInputStream (). close () blocchi. Da JavaDoc non vedo perché questo può accadere. Inoltre, io non capisco perché lo dice javadoc " Lo fa il metodo di chiusura di InputStream . & Quot nulla; (link a javadoc) Potrebbe qualcuno lo spiega?
Se guardi Javadoc, vedrai InputStream una classe astratta. Le sottoclassi che estendono InputStream dovrebbero sovrascrivere il metodo close () (se necessario). Chiaramente la sottoclasse InputStream che stai usando fa qualcosa nel metodo close.
Aggiungendo ciò che ha scritto jdigital, controlla articolo . Si tratta del metodo Runtime.exec ()
e ProcessBuilder
è stato introdotto in Java 5, ma mi sembra che la discussione possa essere estrapolata ai processi di sistema in generale.
Penso di averlo capito. Ovviamente è importante chiamare process.getOutputStream (). Close () prima di process.getInputStream (). Close () e process.getErrorStream (). Close ().