2012-10-31 14 views
8

Chciałbym odczytywać dane wyjściowe i strumienie błędów procesu i połączyć je w jeden strumień tekstu. Mój program jest w Groovy i brzmi tak:Co to jest wątek ByteArrayOutputStream bezpieczny dla wątków?

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

Problemem jest to, że nie jest ByteArrayOutputStream wątku bezpieczne i waitForProcessOutput() generuje dwa wątki, które dołącza do mergeStream. Czy istnieje wariant bezpieczny dla wątków, którego mogę użyć? Jak inaczej radzisz kontrolować dostęp do mergeStream? Wygląda na to, że w praktyce takie postacie czasami są odrzucane.

+2

Czy brałeś pod uwagę redirectErrorStream ProcessBuildera? – artbristol

+0

Tak, * jest * wątkowo bezpieczny, a raczej wszystkie jego metody są zsynchronizowane, a 'ProcessBuilder.redirectErrorStream()' sprawia, że ​​całe pytanie jest zbędne. To nie jest prawdziwe pytanie. – EJP

+1

@EJP - to tylko "nie jest prawdziwe pytanie", jeśli znasz odpowiedź - w przeciwnym razie jest to WIELKIE pytanie! Javadoc nie mówi nic o tym, że jest zsynchronizowany - AFAICT, musisz wykopać źródło, żeby to odkryć, i nigdy bym się nie przejmował (zakładając, że nie było to nici bezpieczne, ponieważ doktor nic nie powiedział), gdybyś nie skomentował. –

Odpowiedz

7

Jeśli process.waitForProcessOutput() bierze OutputStream jako argumentu, można po prostu użyć niestandardową implementację OutputStream który ma wszystkie swoje metody zsynchronizowane, i przekazać do odpowiedniego sposobu zawiniętej ByteArrayOutputStream. Podobnie jak Collections.synchronizedList() zawija kolejną listę do zsynchronizowanego proxy listy.

EDIT:

Powiedział, że czytanie źródło ByteArrayOutputStream, wszystkie jego metody są już zsynchronizowane, tak to już jest bezpieczny wątku. Twój błąd prawdopodobnie pochodzi z innych źródeł.

Powiązane problemy