Betrachten Sie den folgenden JUnit-Test:
%Vor% Der Test schlägt fehl, obwohl der unterbrochene Status gesetzt wurde.
Ich habe vermutet, dass die Zeile blockingThread.join();
das Flag zurücksetzt, aber selbst wenn diese Zeile durch Thread.sleep(3000);
ersetzt wird, schlägt der Test immer noch fehl. Ist dieses Verhalten irgendwo dokumentiert?
Was wir sehen, ist, dass der unterbrochene Status eines Threads gelöscht wird, wenn dieser Thread beendet wird. Es ist nicht in Ссылка dokumentiert, kann also als eine Spezifikation angesehen werden oder Implementierungsfehler.
Von den JavaDocs: "Eine Threadunterbrechung, die ignoriert wird, weil ein Thread zum Zeitpunkt des Interrupts nicht aktiv war, wird von dieser Methode als falsch zurückgegeben."
Ihr Thread war noch nicht gestartet, als Sie "Thread.interrupt ()" aufgerufen haben.
Das Erstellen von Komponententests für gleichzeitige Systeme ist ziemlich schwierig. Sie können es etwas robuster machen, indem Sie dem Test eine Verzögerung hinzufügen, aber das verlangsamt leider die Testausführung, so dass Sie nicht viele davon haben können.
Um es ausfallsicher zu machen, müssen Sie der Thread-Klasse ein boolesches Flag hinzufügen, das dem Test mitteilt, dass es gestartet wurde, und darauf warten, dass dieses Flag in einer Busy-Schleife ausgelöst wird. Nur dann können Sie Interrupt und Join aufrufen.
Tags und Links java concurrency