2016-05-24 6 views
-2

Ich mache ein einfaches Chat-Programm mit Sockets, und ich habe eine ArrayList, um aktive objected Klassen mit Sockets und Benutzernamen für jeden angeschlossenen Client zu speichern, und innerhalb dieser Klassen überprüft es, ob der Socket ist immer noch offen, und ruft zu sich selbst zu verbinden, wenn es nicht ist.Java-Programm hängt beim Beitritt zu einem Thread

Server Datei Kick Code:

public synchronized void kick(ClientThread client){ 
    try{ 
     output.printLine("kicking " + client.getUsername()); 
     clients.remove(client); 
     output.printLine("removed " + client.getUsername()); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    output.printLine("kicked "); 
} 

Dies ist, was durch das Client-Objekt aufgerufen wird, wenn die Fassung geschlossen ist.

Kunden ist die Arraylist, die die Kunden

Client ist das Klassenobjekt speichert, die ich anschließen möchten, erstreckt sich das Client-Objekt Thema

public void run(){ 

    while(true){ 
     try{ 
      Thread.sleep(10); 
      if(isValid()){ 
       /*bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       if(bufferedReader.ready()){ 
        lastMsg = bufferedReader.readLine(); 
        sendMessage("Hello"); 
        bufferedReader.close(); 
       }*/ 
      }else{ 
       output.printLine(this.getUsername() + " connection closed"); 
       break; 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    server.kick(this); 
    try { 
     join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    output.printLine("joined " + getUsername()); 
} 

Dies ist die Lauffunktion vom Client-Objekt, bei Die Unterseite ist der Code, der ausgeführt wird, wenn der Socket nicht verbunden ist, er bricht aus der Schleife und sollte sich selbst verbinden, jedoch bleibt er hängen, wenn er sich selbst anschließt. Der Client wird ordnungsgemäß aus der ArrayList entfernt, aber egal was ich tue, ich kann den Thread nicht dazu bringen, beizutreten.

+0

_soll sich selbst anschließen_ Was bedeutet das? –

Antwort

1

Dies kann nicht funktionieren. Um join bedeutet ein Thread zu warten, bis es starb. Wenn du darauf wartest, dass du stirbst, wirst du ewig warten, denn solange du wartest, kannst du nicht sterben.

+0

Ich wünschte, es wäre so einfach, den Tod zu täuschen: P –

+0

Ich dachte, es wäre ein Fall von Beitritt ception D: Weißt du, wie ich diesem Thread beitreten kann, ohne dass es hängt? – Ventz

+0

Hängt davon ab, wie Sie Join definieren. Wie gesagt, du kannst dich nicht selbst anschließen, wenn du dich in diesem Kontext befindest, bedeutet zu warten, dass der Thread stirbt und während du wartest, kannst du nicht sterben. – Vampire

0

Wenn der Socket immer noch geöffnet ist, und fordert, dass sein Selbst verbunden wird, wenn dies nicht der Fall ist.

Ein Thread kann nicht aufgerufen werden, sich selbst zu verbinden. Wenn ein Thread beendet werden soll, kehrt er einfach von der run() Methode zurück. Andere Threads, die darauf warten, dass dieser Thread stirbt, können thread.join() darauf aufrufen. Aber wie @Vampire darauf hingewiesen hat, dass ein Thread this.join() aufrufen wird bedeutet, dass es auf sich selbst wartet, um zu beenden, aber es wird nie, weil es auf sich selbst wartet, um zu beenden. In der Tat.

aber egal was ich tun kann ich nicht den Thread zu verbinden.

Ich denke, die Frage ist hier, was Sie versuchen zu erreichen. Wenn Sie möchten, dass der Thread beendet wird, kehren Sie einfach von der run() Methode zurück. Wenn Sie versuchen, andere Threads zu benachrichtigen, die Sie beenden, sollten sie das join -ing tun.