Wat doet java.lang.Thread.interrupt()?

Kun je uitleggen wat java.lang.Thread.interrupt()doet wanneer het wordt aangeroepen?


Antwoord 1, autoriteit 100%

Thread.interrupt()stelt de onderbroken status/vlag van de doelthread in. Dan KAN code die in die doelthread wordt uitgevoerd, de onderbroken status pollen en op de juiste manier afhandelen. Sommige methoden die blokkeren, zoals Object.wait()kunnen de onderbroken status onmiddellijk in beslag nemen en een passende uitzondering genereren (meestal InterruptedException)

Onderbreking in Java is niet preventief. Anders gezegd, beide threads moeten samenwerken om de interrupt goed te verwerken. Als de doelthread de onderbroken status niet opvraagt, wordt de interrupt effectief genegeerd.

Polling vindt plaats via de methode Thread.interrupted()die de onderbroken status van de huidige thread retourneert EN die onderbrekingsvlag wist. Meestal kan de thread dan iets doen zoals InterruptedException gooien.

EDIT (van Thilo-opmerkingen): Sommige API-methoden hebben ingebouwde interruptafhandeling. Van de top van mijn hoofd omvat dit.

  • Object.wait(), Thread.sleep()en Thread.join()
  • De meeste java.util.concurrent-structuren
  • Java NIO (maar niet java.io) en het gebruikt GEEN InterruptedException, maar gebruikt ClosedByInterruptException.

EDIT (van @thomas-pornin‘s antwoord op exact dezelfde vraagvoor de volledigheid)

Draadonderbreking is een zachte manier om een draad te verdringen. Het wordt gebruikt om threads een kans te geven om netjesaf te sluiten, in tegenstelling tot Thread.stop()dat meer lijkt op het doorschieten van de thread met een aanvalsgeweer.


Antwoord 2, autoriteit 27%

Wat is onderbreken?

Een interrupt is een indicatie voor a
draad dat het moet stoppen met wat het is
doen en iets anders doen. Het is op
aan de programmeur om precies te beslissen
hoe een thread reageert op een interrupt,
maar het is heel gebruikelijk voor de draad
te beëindigen.

Hoe wordt het geïmplementeerd?

Het onderbrekingsmechanisme is geïmplementeerd
met behulp van een interne vlag die bekend staat als de
onderbrekingsstatus. aanroepen van
Thread.interrupt stelt deze vlag in. Wanneer
een thread controleert op een interrupt door
het aanroepen van de statische methode
Discussie.onderbroken, onderbrekingsstatus
wordt gewist. De niet-statische
Thread.isInterrupted, die wordt gebruikt door
één thread om de interrupt op te vragen
status van een ander, verandert niets aan de
vlag onderbreken status.

Citaat van Thread.interrupt()API:

Onderbreekt deze thread. Eerst de
checkToegangsmethode van deze thread is
ingeroepen, wat kan leiden tot een
SecurityException moet worden gegooid.

Als deze thread is geblokkeerd in een
aanroep van de wait(), wait(long),
of wacht (lang, int) methoden van de
Objectklasse, of van de join(),
join (lang), join (lang, int),
slapen (lang), of slapen (lang, int),
methoden van deze klasse, dan is het
onderbrekingsstatus wordt gewist en
het zal een ontvangen
InterruptedException.

Als deze thread is geblokkeerd in een I/O
operatie op een onderbreekbaar
kanaal dan het kanaal is
Gesloten, de onderbrekingsstatus van de thread
zal worden ingesteld en de draad zal
Ontvang een geslotenByinterruptException.

Als deze draad is geblokkeerd in een
Selector DAN de interrupt van de thread
status wordt ingesteld en het zal terugkeren
onmiddellijk van de selectie
operatie, mogelijk met een niet-nul
waarde, net als de selector
Weksup-methode werd aangeroepen.

Als geen van de vorige omstandigheden
Houd dan de onderbreking van deze thread
status wordt ingesteld.

Controleer dit voor volledig begrip over hetzelfde:

http://download.oracle.com/javase/tutorial/ Essential / Concurrency / Interrupt.html


3, Autoriteit 6%

Als de gerichte draad is gewacht (door wait(), of een aantal andere gerelateerde methoden die in wezen hetzelfde doen, zoals sleep()), Het wordt onderbroken, wat betekent dat het stopt met wachten op waar het wacht op en in plaats daarvan een interruptedexception ontving.

Het is volledig aan de draad zelf (de code die wait()) noemde om te beslissen wat u in deze situatie moet doen. Het beëindigt de draad niet automatisch.

Het wordt soms gebruikt in combinatie met een beëindigingsvlag. Bij onderbroken kan de draad deze vlag controleren en vervolgens opsluiten. Maar nogmaals, dit is slechts een conventie.


4, Autoriteit 5%

Voor de volledigheid, naast de andere antwoorden, als de draad wordt onderbroken voordat het is ingeschakeld op Object.wait(..)of Thread.sleep(..)etc., dit komt overeen met het onderbroken onmiddellijk na het blokkeren op die methode , zoals het volgende voorbeeld laat zien.

public class InterruptTest {
    public static void main(String[] args) {
        Thread.currentThread().interrupt();
        printInterrupted(1);
        Object o = new Object();
        try {
            synchronized (o) {
                printInterrupted(2);
                System.out.printf("A Time %d\n", System.currentTimeMillis());
                o.wait(100);
                System.out.printf("B Time %d\n", System.currentTimeMillis());
            }
        } catch (InterruptedException ie) {
            System.out.printf("WAS interrupted\n");
        }
        System.out.printf("C Time %d\n", System.currentTimeMillis());
        printInterrupted(3);
        Thread.currentThread().interrupt();
        printInterrupted(4);
        try {
            System.out.printf("D Time %d\n", System.currentTimeMillis());
            Thread.sleep(100);
            System.out.printf("E Time %d\n", System.currentTimeMillis());
        } catch (InterruptedException ie) {
            System.out.printf("WAS interrupted\n");
        }
        System.out.printf("F Time %d\n", System.currentTimeMillis());
        printInterrupted(5);
        try {
            System.out.printf("G Time %d\n", System.currentTimeMillis());
            Thread.sleep(100);
            System.out.printf("H Time %d\n", System.currentTimeMillis());
        } catch (InterruptedException ie) {
            System.out.printf("WAS interrupted\n");
        }
        System.out.printf("I Time %d\n", System.currentTimeMillis());
    }
    static void printInterrupted(int n) {
        System.out.printf("(%d) Am I interrupted? %s\n", n,
                Thread.currentThread().isInterrupted() ? "Yes" : "No");
    }
}

Uitvoer:

$ javac InterruptTest.java 
$ java -classpath "." InterruptTest
(1) Am I interrupted? Yes
(2) Am I interrupted? Yes
A Time 1399207408543
WAS interrupted
C Time 1399207408543
(3) Am I interrupted? No
(4) Am I interrupted? Yes
D Time 1399207408544
WAS interrupted
F Time 1399207408544
(5) Am I interrupted? No
G Time 1399207408545
H Time 1399207408668
I Time 1399207408669

Implicatie: als u het volgende lijdt, en de interrupt optreedt op het exacte moment waarop de besturing is achtergelaten Thread.sleep(..)en gaat nog steeds naar de loop optreden. Dus het is volkomen veilig om te vertrouwen op de interruptedexceptie die betrouwbaar wordt gegooid nadat de draad is onderbroken :

while (true) {
    try {
        Thread.sleep(10);
    } catch (InterruptedException ie) {
        break;
    }
}

5

Thread.interrupt()Stelt de onderbroken status / vlag van de doeldraad in op TRUE, die bij het controleren van Thread.interrupted()kan helpen bij het stoppen van de eindeloze draad . Raadpleeg http://www.yegor256.com/2015/10/20/ onderbroken-uitzondering.html


6

openbare leegte onderbreking ()

onderbreekt deze thread.

Tenzij de stroomdraad zichzelf onderbreekt, is dat altijd toegestaan, wordt de checkaccess-methode van deze draad ingeroepen, wat een beveiligingsexceptie kan veroorzaken.

Als deze draad is geblokkeerd in een aanroeping van het wachten (), wacht (lang) of wacht (lange, int) methoden van de objectklasse, of van de join (), doe mee (lang), doe mee , int), slaap (lang) of slaap (lang, int), methoden van deze klasse, dan zal de onderbrekingsstatus worden gewist en het ontvangt een interruptedexception.

Als deze draad is geblokkeerd in een I / O-bediening op een onderbreekbaar kanaal, wordt het kanaal gesloten, de onderbrekingsstatus van de thread wordt ingesteld en ontvangt de draad een geslotenByinterruptException.

Als deze draad in een selector is geblokkeerd, wordt de onderbrekingsstatus van de thread ingesteld en wordt deze onmiddellijk van de selectiebewerking teruggekeerd, mogelijk met een niet-nulwaarde, net alsof de wekmethode van de selector wordt aangeroepen.

Als geen van de vorige voorwaarden vasthoudt, wordt de interruptstatus van deze thread ingesteld.

Een draad onderbreken die niet in leven hoeft geen effect te hebben.

worpen:
SecurityException – Als de huidige draad deze thread

niet kan wijzigen


7

Een interrupt is een indicatie voor een thread dat deze moet stoppen met wat hij aan het doen is en iets anders moet doen. Het is aan de programmeur om precies te beslissen hoe een thread reageert op een interrupt, maar het is heel gebruikelijk dat de thread wordt beëindigd.
Een zeer goede referentie: https://docs.oracle.com/javase/ tutorial/essential/concurrency/interrupt.html


Antwoord 8

Thread.interrupt() methode stelt interne ‘interrupt status’ vlag in. Gewoonlijk wordt die vlag gecontroleerd door de methode Thread.interrupted().

Volgens afspraakmoet elke methode die bestaat via InterruptedException de vlag van de onderbrekingsstatus wissen.

Other episodes