Faden ist nicht unterbrechbare

studentaccount4:

Ich versuche, auf den berühmten speisenden Philosophen an die Arbeit und seine ganz fertig, aber ich bin eine ziemlich harte Zeit versucht zu Interrupt-Threads haben.

so wie Sie in diesem Problem wissen, haben wir 5 Fäden (Philosophen) und den Benutzersatz ein Experiment Zeitpunkt, an dem das Experiment enden wird.

beachtenswert, dass ich sah mehrere Antworten auf Stackoverflow.

Die erste ist von @Konrad Reiche Wie man einen Thread in Java töten kann? / Link Stackoverflow

In diesem besonderen Beitrag haben die Menschen festgestellt, dass unter Verwendung von flüchtigen boolean als Flag funktionieren könnte, aber ich habe Angst, dass sie bei der Ausübung Papier angegeben ist, dass ich die volatile boolean verwenden kann nicht einen Thread zu unterbrechen, aber ich es für andere Zwecke nutzen kann . (Studium Übung).

Das zweite ist Gewinde Interrupt () nicht unterbricht Thema / Stackoverflow - Link

noch nichts wirklich geholfen !.

Ich werde versuchen, den notwendigen Code zu schaffen, und ich hoffe, jemand würde nur meinen Fehler / s hinweisen. die Klasse Tutor ist öffentlich und erstreckt Thema !.

1) Erster Versuch: (könnte vom Professor abgelehnt bekommen, wenn er nicht will sie uns flüchtiges boolean als Flag verwenden)!

wenn volatile boolean wie diese verwenden es funktioniert:

private volatile boolean isNotStopped=true;

@Override
public void stopPhilosopher() {
    System.out.printf("\n%s will stop.\n",selfPhilosopher.getName());
    selfPhilosopher.interrupt();
    isNotStopped=false;
}


@Override
public void run() {
    while (isNotStopped){//selfPhilosopher is a thread equals to this!.
        try {
                think();
                eat();
        } catch (InterruptedException e) {//somehow this was never triggered!.
            System.out.printf("%s was interrupted.\n",selfPhilosopher.getName());
        }finally {//in the finally block i always get RUNNER, FALSE
            System.out.printf("the %s is %s and is interrupted %b.\n", selfPhilosopher.getName(),selfPhilosopher.getState(), selfPhilosopher.isInterrupted());
        }
    }
}

[UPDATE] auf Zweiter Versuch: [Working]

Ersetzen selfPhilosopher.isInterrupted()mit Thread.currentThread().isInterrupted()machte keinen Unterschied , wieselfPhilosopher=this;

doch ich war immer von der „stoppt“ stopPhilosopher()Methode , aber die Fäden scheinen wie Zombies zu sein , immer wieder zurück ins Leben kommen :(

aufgrund der Tatsache , dass ich ziemlich von der Meinung überzeugt bin @Konrad Reich von der ersten Referenz zur Verfügung gestellt und die Antwort von @Nathan Hughes mir von der Java den boolean - Flag mit der Verwendung bereitgestellt werde haften bleiben , isInterrupted()anstatt ein flüchtiges Flag zu verwenden.

@Override
public void stopPhilosopher() {
    System.out.printf("\n%s will stop.\n",selfPhilosopher.getName());
    selfPhilosopher.interrupt();

}

@Override
public void run() {
    while (!selfPhilosopher.isInterrupted()){//selfPhilosopher is a thread equals to this!.
        try {
                think();
                eat();
        } catch (InterruptedException e) {//somehow this was never triggered!.Now it works.
            System.out.printf("%s was interrupted from catch clause!..\n",selfPhilosopher.getName());
            selfPhilosopher.interrupt();
        }
    }
}

AUSGABE:

 Philosopher2 in seat nr: 2 was interrupted from catch clause!..
Nathan Hughes:

Wenn ein InterruptedException geworfen wird, wird der Interrupt-Flag gelöscht. Das heißt, die nächste Überprüfung der Schleife macht den Faden anzeigt nicht unterbrochen wird und der Faden wird weiterlaufen. Das ist, was Sie sehen, wenn Sie schließlich druckt für die Interrupt-Flag sich als falsch heraus blockieren.

Dies ist beschrieben in der API doc für den Schlaf - Methode :

InterruptedException - wenn ein Thread hat den aktuellen Thread unterbrochen. Der unterbrochene Zustand des aktuellen Threads gelöscht, wenn diese Ausnahme ausgelöst.

Fügen Sie diese Zeile auf den Block, in dem Sie eine InterruptedException fangen:

Thread.currentThread().interrupt();  // restores interrupt flag

Ich denke du magst

Origin http://10.200.1.11:23101/article/api/json?id=400896&siteId=1
Empfohlen
Rangfolge