2016-07-20 8 views
0

Ich habe eine Klasse, die eine Verbindung zu einem Server wie folgt herstellt.Setzen von "Flags" zwischen Threads in Java

Der Consumer, der der msgHandler ist, fragt häufig den Socket ab, wenn eine Verbindung jemals wie folgt untergeht.

@Override 
public void connectionInit(Socket s) throws IOException { 
    logger.info("Connected to AWW Service on " + configuration.getAwwHost() + ":" + configuration.getAwwPort()); 

    output = new BufferedOutputStream(s.getOutputStream()); 

    connector.componentReady(); 
    Timer t = new Timer(); 
    t.schedule(new TimerTask() { 
     @Override 
     public void run() { 
       try { 
        pollServer(); 
       } catch (IOException e) { 
        // SOCKET GETS BROKEN HERE 
       } 
     } 
    }, 0, 25000); 

} 

Frage ist, wie kann ich von der Ausnahme kommunizieren i erhalten, wenn die Socket-Verbindung wird auf die run() Faden gebrochen zurück, so kann er versuchen, den Sockel und den Eingangsstrom neu zu initialisieren?

Ich glaube nicht, dass ein notify() oder wait() Mechanismus hier angebracht ist, da wait() den run() Thread einfach in den Ruhezustand versetzt. Ich dachte, was ist das Äquivalent zum Setzen eines Flags, wenn die Verbindung unterbrochen wird, und der run() - Thread überprüft ständig das Flag, und wenn es auf True festgelegt ist, initialisiert es den Socket neu. Aber ich bin mir sicher, dass es einen effizienteren Multi-Threading-Ansatz geben würde, der nativ zu Java ist, um dies zu erreichen.

Antwort

0

Ich denke, der einfachste Ansatz ist die Verwendung einer AtomicBoolean Variable, die für beide Threads zugänglich ist - Sie könnten die Variable übergeben, wenn Sie die Run-Klasse jedes Threads bei Bedarf erstellen. Das Schöne an AtomicBoolean ist, dass es bereits threadsicher/synchronisiert und veränderbar ist, so dass es per Referenz weitergegeben und modifiziert werden kann.

Weitere Details finden Sie unter similar question.

0

Ich denke, dass in der run() Funktion, sollten Sie einen Code wie folgt haben.

// ... 
try 
{ 
    // ... 
    int read = input.read(...); 
    // ... 

} 
catch (IOException e) 
{ 
    // TODO: terminate the thread and restart a new connection 
} 

Also, wenn ein Fehler während der pollServer() Anruf auftritt, sollte auch meinen Code über eine Ausnahme erzeugen.

Auch wenn Sie die close-Funktion eines Socket-Objekts aufrufen, generieren die Eingabe- und Ausgabeströme die relativen Ausnahmen.