Im Grunde rufe ich BufferedReader.ReadLine(); Ich bin jedoch in einem Multithreading-Server, wo ich einen Knoten in einem Baum synchronisiere. Also, wenn diese ReadLine-Funktion aufgerufen wird, wenn jemand anderes den Knoten erreicht, sind sie ausgesperrt. Ich kann nicht herausfinden, wie ich ein Zeitlimit für die Zeit setzen kann, die ReadLine auf eine Antwort wartet, bevor der Thread beendet wird. Das Naheliegendste war, einen neuen Thread zu erstellen, der für 1 ms schläft und dann prüft, ob die Variable, auf die ich ReadLine gesetzt habe, geändert wurde. Also etwas wie dies:
synchronized (pointer) {
String answer = "";
Thread d = new Thread(new Runnable() {
public void run() {
try {
int i = 0;
while (answer.equals("")) {
if (i == 10000) {
System.out.println("Timeout Occured");
System.exit(0);
}
try {
Thread.sleep(1);
i++;
}
catch(Exception e) {
System.out.println("sleep problem occured");
}
}
}
catch (IOException ex) {
}
}
});
d.start();
answer = socketIn.readLine();
}
Das tat, was ich wollte, aber ich konnte nicht herausfinden, wie ich den aktuellen Thread stoppen konnte, um den Knoten zu entsperren, damit andere Benutzer weitermachen konnten, anstatt den gesamten Server abzuschalten. Schließlich dachte ich, vielleicht könnte ich dies tun:
Thread d = new Thread(new Runnable() {
public void run() {
try {
answer = socketIn.readLine();
} catch (IOException ex) {
}
}
});
d.join(10000);
catch (InterruptedException e){
socketOut.println("Timeout Occured. Returning you to the beginning...");
socketOut.flush();
return;
}
Aber das scheint immer noch zu blockieren und nicht in der Lage zu sein, fortzufahren. Kann mir jemand dabei helfen? Ich kann nicht verstehen, was ich falsch mache?
Ich habe auch versucht, den ExecutorService zum Laufen zu bringen, aber das ist mir nicht gelungen. Ist das meine Antwort? Wie würde ich es implementieren?
[EDIT] socketIn ist ein BufferedReader, sollte gesagt haben, dass explizit sorry. Außerdem verbindet sich der Client über Telnet, obwohl ich nicht glaube, dass das eine Rolle spielt.
Was ich hier tue, ist ein "Prominenten-Ratespiel", bei dem Benutzer Prominente zum Baum hinzufügen können. Daher muss ich den Knoten, den die Person bearbeitet, aus Gründen der Thread-Sicherheit sperren