Java process.getInputStream () hat nichts zu lesen, deadlocks child

8

Ich habe ein Problem mit einem Prozessumbruch und er tritt nur in Windows XP auf. Dieser Code funktioniert perfekt in Windows 7. Ich bin wirklich ratlos, warum die Streams in XP leer sind. Ich habe auch versucht, die String [] Version von Process.Exec () und es machte keinen Unterschied.

Ich verwende die folgende Klasse, um aus dem Prozess 'STDOUT und STDERR (eine Instanz für jeden Stream) zu lesen:

%Vor%

Und ich benutze es hier:

%Vor%

Hat jemand Ideen? Danke!

Bearbeiten: Hinzugefügte Synchronisation

Bearbeiten: Wie bei einem Update werden die übergeordneten Stream-Reader bei ihrer Leseoperation blockiert. Wenn ich die untergeordneten Prozesse mit dem Task-Manager abbringe, lesen sie den Nullwert vom Schließen des Streams ein.

    
Banana 21.09.2010, 02:25
quelle

4 Antworten

1

Sie müssen eine threadsafe Datenstruktur verwenden; Ich glaube nicht, dass LinkedList threadsafe ist.

    
Jason S 21.09.2010 02:36
quelle
1

Ein Fehler, der mir auffällt ist, dass LinkedList nicht synchronisiert , aber Sie versuchen, in 2 Threads zu schreiben.

Beachten Sie auch, dass Process.getInputStream() den stdout -Stream des Prozesses zurückliefert. Daher sollten Sie die Variable, die momentan stdin heißt, in stdout umbenennen, um Verwirrung zu vermeiden.

    
oksayt 21.09.2010 02:39
quelle
1

Es gibt bekannte Fehler in Windows-Betriebssystemen vor Vista, bei denen das Laden von DLLs zu einem Hängenbleiben in IO führen kann.

z.B. siehe Ссылка und < a href="https://connect.microsoft.com/VisualStudio/feedback/details/94701/loadlibrary-deadlocks-with-a-pipe-read"> Ссылка

Ich bin mir nicht sicher, ob das genau das ist, wo du gerade rennst, aber es mag verwandt sein.

Außerdem erinnere ich mich vage an einige Probleme beim Erhalt einer gültigen stdin und stdout von Nicht-Konsolen-Windows-Anwendungen. Wenn Ihr Aufruf von 'test.jar' 'javaw' anstelle von 'java' verwendet, könnte dies auch die Ursache für Ihr Problem sein.

    
Burleigh Bear 21.09.2010 03:31
quelle
1

Da einige native Plattformen nur eine begrenzte Puffergröße für Standardeingabe- und -ausgabeströme bieten, kann das fehlerhafte Schreiben des Eingabedatenstroms oder das Lesen des Ausgabestreams des Unterprozesses dazu führen, dass der Unterprozess blockiert und sogar blockiert.

    
zyxna 28.02.2012 15:06
quelle

Tags und Links