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 :-)

È stato utile?

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 ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top