2016-12-06 5 views
1

Ich habe eine KlasseIgnorieren InterruptedException von einem anderen Thread geworfen

class Foo { 
    static void bar() throws InterruptedException { 
     // do something 
     Thread.sleep(1000); 
    } 

    static void baz(int a, int b, int c) throws InterruptedException { 
     // do something 
     Thread.sleep(1000); 
    } 
} 

Dann einfach es laufe ich in meinem Haupt

class Main { 
    public static void main() { 
     new Thread(Foo::bar).start(); 
     new Thread(() -> Foo.baz(1, 2, 3)).start(); 
     new Thread(() -> Foo.baz(1, 2, 3)).start(); 
    } 
} 

mich nicht über die InterruptedException kümmern. Ich habe versucht, einen try-catch-Block zu schreiben, aber offensichtlich wird die Ausnahme nicht abgefangen. Java erlaubt mir nicht, main() zu werfen.

Wie kann ich diese Ausnahme ignorieren, die mir überhaupt egal ist? Ich möchte in jedem Thread-Konstruktor keinen try-catch-Block schreiben.

Die Ausnahme sollte manchmal geworfen werden, aber in diesem speziellen Fall ist mir egal.

+0

Wo haben Sie den Try-Catch-Block hinzufügen? – user1766169

+0

Ein Thread wird mit einem Runnable erstellt, und ein Runnable kann keine geprüfte Ausnahme auslösen. – Sam

+1

Nein, es ist kein Duplikat, weil es trivial ist, es in einem einzigen Thread zu erfassen. Und es ist nicht trivial, es ohne Code-Wiederholung oder schlechtes Design Multithreaded zu fangen. – marmistrz

Antwort

1

Bei dieser Lösung I definiert eine Schnittstelle Interruptible, und ein Verfahren ignoreInterruption, die ein Interruptible auf ein Runnable konvertiert:

public class Foo { 

    public static void main(String... args) { 
    new Thread(ignoreInterruption(Foo::bar)).start(); 
    new Thread(ignoreInterruption(() -> Foo.baz(1, 2, 3))).start(); 
    } 

    static void bar() throws InterruptedException { 
    // do something 
    Thread.sleep(1000); 
    } 

    static void baz(int a, int b, int c) throws InterruptedException { 
    // do something 
    Thread.sleep(1000); 
    } 

    interface Interruptible { 
    public void run() throws InterruptedException; 
    } 

    static Runnable ignoreInterruption(Interruptible interruptible) { 
    return() -> { 
     try { 
     interruptible.run(); 
     } 
     catch(InterruptedException ie) { 
     // ignored 
     } 
    }; 
    } 

} 
1

Fangen Sie einfach die Ausnahme in Ihrer Methode und ignorieren Sie sie. Du unterbrichst den Thread nie, also wird das in Ordnung sein.

static void bar() { 
    try { 
    // do something 
    Thread.sleep(1000); 
    } catch (InterruptedException ignored) { } 
} 
+0

Manchmal möchten wir InterruptedException werfen und nicht ignorieren. Es ist nur dieser eine Fall, ich möchte es ignorieren – marmistrz

Verwandte Themen