Nach dem starten eines thread wie könnten wir halten der run-Funktion läuft? Ich habe paar Ideen, aber ich bin mir nicht sicher, was ist professioneller?
In einem Thread
Nach dem Aufruf der start()
wie Sie wissen, es wird rufen der run()
Funktion in der Runnable
Klasse. In der run()
Funktion will ich der thread bleibt solange erhalten die "Bye" - Nachricht vom client. Wenn ich setzen Sie Sie in die while-Schleife dauert es haufenweise Speicher und ich denke, ich bin nicht mit der macht der thread. Übrigens ich will nicht, dass mein thread schlafen in der run-Funktion, durch den Aufruf Thread.sleep(6000);
gibt es eine andere Möglichkeit zu übernachten gibt es in der run-Funktion?
-
Wenn die Antwort beizutreten, wo und wie und verwenden Sie es? Sollte ich pop es zu Beginn der run-Funktion, und es bleibt dort, bis ich das "Tschüss" vom client?
-
Soll ich sagen
while((request=in.readLine())!=null){
? Es hat nicht funktioniert, weil ich denke, es wird verlieren Sie die Verbindung mit dem client-oder besser gesagt-client verliert die Verbindung? -
Soll ich sagen
while(Thread.isAlive)
und dann töten die Bedrohung, wenn ich die Meldung "Bye" durch den AufrufThread.stop
ist wenig gefährlich?
Hier mein vereinfachter code:
while(true)
{
ClientWorker w;
try
{
w = new ClientWorker(serverSocket.accept());
Thread t = new Thread(w);
t.start();
}
...... }
class ClientWorker implements Runnable {
public ClientWorker(Socket incoming)
{
myList = my;
this.incoming = incoming;
}
public synchronized void run()
{
in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
.
.
..
...
}
- Ich bin wirklich verloren, was problem, das Sie versuchen zu lösen, hier. Ich würde beginnen mit der einfachsten Lösung möglich und nicht versuchen, Probleme zu lösen, die möglicherweise nie passieren, mit zu beginnen.
- Kann sein, meine Frage ist nicht klar. Ich versuche zu bleiben int die Funktion run. das ist gesetzt.
- was hindert Sie bleiben in der run () - Methode? z.B. mit der while-Schleife, die Sie vorgeschlagen.
- Ich wollte nicht zu verwenden, während da geht es durch alle codes in der run-Funktion und es ist eine Art Schleife. Ich bin auf der Suche nach etwas, zum Beispiel in der ServerSocket-wir haben eine Funktion namens request() darauf wartet, dass ein Anruf von dem server!!!
- Du willst also einen listener für Ereignisse wie, wenn eine neue Zeile gelesen werden kann? Sie können schreiben, wenn Sie möchten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im einfachsten Fall lassen Sie Ihrer run-Methode die Arbeit machen und kündigen, wenn es angebracht ist, so etwas wie dieses:
Hier der Prozess Stoppt, wenn der doWork () - Methode gibt false zurück. Es ist auch guter Stil, dass Ihre thread unterbrochen werden, vor allem wenn es braucht, um für eine lange Zeit laufen, sehen dieses tutorial. Für jede dieser arbeiten, doWork() sollte regelmäßig wiederkehren. Hinweis: Sie können nicht neu starten, threads, sobald die run-Methode zurückgegeben wurde, der thread ist vom system freigegeben.
Wenn Sie mehr Kontrolle über Ihre Fäden, Sie könnten separate Worker-und ThreadManager Klassen.
Lassen den ThreadManager kündigen die Arbeiter, erstellen eine volatile boolean-Feld in Ihr Arbeiter, die in regelmäßigen Abständen überprüft:
Den Arbeiter endet, wenn unterbrochen oder wenn die Arbeit abgeschlossen ist. Auch der ThreadManager auf verlangen der Arbeiter zu stoppen, indem er die stopRunning () - Methode.
Wenn Ihr thread läuft aus arbeiten, könnte es auch der Aufruf der Methode wait() auf den ThreadManager. Dies hält den thread, bis es mitgeteilt, dass es eine neue Arbeit zu tun. Der ThreadManager rufen soll, notify() oder notifyAll() auf, wenn neue Arbeit ankommt (ThreadManager dient als monitor in diesem Beispiel).
Mit diesem Ansatz können Sie halten die Arbeiter einfach und nur mit dem tun der Arbeit. Der ThreadManager bestimmt die Anzahl der threads und macht die Arbeit zur Verfügung, um Sie aber nicht zu wissen, details der eigentlichen Arbeit. Einen Schritt weiter wäre die split-out "arbeiten" in einer separaten Klasse zu, die Sie nennen könnte-Job. Ein Beispiel HIERFÜR finden Sie in meinem webcrawler Beispiel. Dies könnte nützlich sein für die übergabe von arbeiten aus den ThreadManager, um den worker-thread.
Ich weiß, das ist spät, aber das ist eine viel bessere Umsetzung und vermeidet hohe CPU-Auslastung durch busy waiting - Ermöglicht die Kontext-Umschaltung, wenn der thread wartet auf ein signal.
Einstellung der semaphore auf einen Wert von 0 sorgt dafür, dass, wenn der thread versucht zu erwerben, die Erlaubnis, um fortzufahren, es nicht bekommen und wartet. Bei der Freigabe der semaphore, die Zählung wird um 1 erhöht, so dass der thread weiter, und die Zählung wird verringert auf 0 zurück.
In main:
Der Thread
nur
return
von derrun()
wenn man"bye"