2012-10-31 6 views
8

Mi piacerebbe leggere dall'output di un processo e dai flussi di errore e unirli in un unico flusso di testo. Il mio programma è in Groovy e si legge come questo:Che cos'è un ByteArrayOutputStream sicuro per i thread?

def mergeStream = new ByteArrayOutputStream() 
process.waitForProcessOutput(mergeStream, mergeStream) 

Il problema è che ByteArrayOutputStream non è thread-safe e waitForProcessOutput() genera due fili che aggiungere al mergeStream. C'è una variante thread-safe che posso usare? In quale altro modo si consiglia di controllare l'accesso a mergeStream? Sembra che in pratica i personaggi vengano talvolta abbandonati con questa implementazione.

+2

Avete considerato il redirectErrorStream di ProcessBuilder? – artbristol

+0

Sì * è * thread safe, o meglio tutti i suoi metodi sono sincronizzati, e 'ProcessBuilder.redirectErrorStream() 'rende ridondante l'intera domanda. Non è una vera domanda. – EJP

+1

@EJP - è solo "non una vera domanda" se conosci la risposta - altrimenti, è una GRANDE domanda! Javadoc non dice nulla sul fatto che sia sincronizzato - AFAICT, devi scavare nella fonte per scoprirlo, e non mi sarei mai preoccupato (supponendo che non fosse a rischio, dal momento che il doc non ha detto nulla) se non avessi commentato. –

risposta

7

Se il process.waitForProcessOutput() prende un OutputStream come argomento, si può semplicemente utilizzare un'implementazione personalizzata OutputStream che ha tutti i metodi sincronizzati, e delegare il metodo corrispondente di una avvolto ByteArrayOutputStream. Proprio come Collections.synchronizedList() avvolge un altro Elenco in un proxy Elenco sincronizzato.

EDIT:

Detto, leggendo la fonte di ByteArrayOutputStream, tutti i metodi sono già sincronizzati, quindi è già thread-safe. Il tuo bug probabilmente viene da altrove.

Problemi correlati