Mein Titel ist wahrscheinlich nicht der beschreibendste, aber ich werde versuchen, so viel Code wie möglich zu zeigen in der Hoffnung, dass es jedem helfen wird, meine Frage besser zu verstehen. So fragt meine Clientseite meines Projekts den Server nach Informationen ab. Dies ist ein Beispiel für eine typische Anfrage:Wie auf eine Socket-Eingabe zu hören, ohne andere Anfragen zu blockieren
private String GENERATEGROUPKEY()
{
/* `out` is a PrintWriter using the sockets output stream */
out.println("GENERATEGROUPKEY");
try
{
/* `in` is a BufferedReader using the sockets input stream */
String response = in.readLine();
String[] temp = response.split(" ");
return temp[1];
}
catch (IOException ex)
{
return null; // throw connection error to client
}
}
Mein Problem ist, zu jeder Zeit, dass der Server eine unaufgeforderte Nachricht an den Client durch diese gleiche Buchse mit Informationen (darüber nachdenken, es wie ein Chat-Client empfängt eine schicke Botschaft). Meine erfolglose Idee war, einen Thread zu erstellen, der auf eine solche Nachricht wartet, solange wir nicht in der Mitte einer anderen Abfrage sind, aber das war auch nicht erfolgreich, denn obwohl ich diesen Thread unterbreche, ist er immer noch mit den Nachrichten beschäftigt bin zur Kundenanfrage gegangen.
private String GENERATEGROUPKEY()
{
out.println("GENERATEGROUPKEY");
listenThread.interrupt(); // block listenThread from recieving response
try
{
String response = in.readLine();
String[] temp = response.split(" ");
listenThread = new PulseThread(in); // we're done, so allow
listenThread.start();
return temp[1];
}
catch (IOException ex)
{
listenThread = new PulseThread(in); // we're done, so allow
listenThread.start();
return null; // throw connection error to client
}
}
Hier ist genau das, was listenThread
ist
public class PulseThread extends Thread
{
private BufferedReader in;
public PulseThread(BufferedReader in)
{
this.in = in;
}
@Override
public void run()
{
while (true)
{
if (Thread.currentThread().isInterrupted())
{
break;
}
try
{
String line = in.readLine();
System.out.println(line);
String[] params = line.split(" ");
if (params[0].equals("PULSED"))
{
NotificationManager.sendNotification("You have been pulsed!", "Pulsed by: " + params[1]);
}
}
catch (Exception ex)
{
}
}
}
}
Ich war vorher unter dem Eindruck, dass in der Mitte des BufferedReader
den Faden zu unterbrechen 'mit readLine()
s blockierenden Anruf würde nur den blockierenden Anruf abbrechen, es sei denn ich m etwas anderes falsch machen.
Jede Hilfe würde sehr geschätzt werden, danke.
EDIT: So in meine Annahme nur ein paar Zeilen über diesem Satz suchen, scheint es die Unterbrechung der Thread bricht nicht readLine()
. Ich denke, die Idee des unterbrechenden Threads ist ein No-Go. Was ist der richtige Weg, dies zu tun?
Mit, err, [tag: multithreading]? Und wo heißt es, dass das Unterbrechen eines Threads die E/A-Operation abbricht, in der es blockiert ist? – EJP
@EJP Ist das keine Multithreading-Frage?Nicht sicher, ob die -1 auf einer legitimen und eindeutigen Frage angemessen war, aber ich schweife ab. Javadocs sagen, und ich zitiere: "Wenn dieser Thread in einer I/O-Operation auf einem unterbrechbaren Kanal blockiert wird, wird der Kanal geschlossen." Gilt das nicht für mich? Wenn nicht, was sind meine möglichen Lösungen, weil ich nicht weiß, was ich tun muss. – Headline
@Headline Das eigentliche Zitat sagt [InterruptibleChannel] (https://docs.oracle.com/javase/8/docs/api/java/nio/channels/InterrupibleChannel.html) wie in einer Java-Klasse. BufferedReader * könnte * eine Ausnahme auslösen, aber da du nichts damit machst, würdest du es nicht wissen. – matt