2017-12-01 1 views
1

Für den folgenden Code Gewinde Einstellen,Interrupt-Flag auf einem

static class SleeperThread extends Thread { 
    public void run() { 
    int c; 
    try { 
     c = System.in.read(); 
    } 
    ... 
    } 
} 

Wie in diesen bug erwähnt, wenn ein Thread auf IO (System.in.read();) blockiert ist, kann dann nicht der Interrupt-Flag zu setzen, dass Thread, von einem anderen Thread?

+2

Ja, es kann. Die Sache ist, dass '' read() 'nicht auf Thread-Unterbrechung prüft. –

+0

@AndyTurner So ist das Interrupt-Flag gesetzt, aber da Java-Thread-Interrupts im Gegensatz zu Hardware-Interrupts synchron sind, müssen wir warten, bis 'read()' abgeschlossen ist. – overexchange

+0

Java-Thread Interrupts sind * kooperativ * in der Natur: der Thread muss explizit auf Unterbrechung prüfen, es passiert nicht nur "passieren". –

Antwort

1

Da System.in auf Thread-Interrupts nicht reagiert, muss man sowas selbst implementieren.

Dazu können Sie die Methode available() der System.in (von InputStream) verwenden.

Es könnte etwas wie folgt aussehen:

class ReadWithInterrupt extends Thread{ 
    private byte[] result = null; 
    public byte[] getResult(){ 
     return result; 
    } 

    @Override 
    public void run(){ 
     try{ 
      while(true){ 
       if (this.isInterrupted()){ 
        System.out.println("An interrupt occurred"); 
        break; 
       } 
       int available = System.in.available(); 
       if (available>0){ 
        result = new byte[available]; 
        System.in.read(result, 0, available); 
        break; 
       } 
       else 
        Thread.sleep(500); 
      } 

     } 
     catch (IOException e){ 
      e.printStackTrace(); 
     } 
     catch (InterruptedException e){ 
      System.out.println("An interrupt occurred"); 
     } 
    } 
} 
Verwandte Themen