Hallo,
hab wegen des Problems bereits einen Thread offen, aber ich denke mit dem FAQ Beitrag von euch lässt es sich besser erklären:
Netzwerkgrundlagen - ServerSocket und Socket
Ausgangspunkt ist also das anschauliche Beispiel bei 4. Threads und Server:
(Copy+Paste)
Server
ServerThread:
Es geht mir darum, wenn mein Server gerade beschäftigt ist (z.B. durch einen einfachen Thread.sleep(5000)), funktioniert die parallele Threadabarbeitung nicht mehr. Grund dafür scheint der BufferedReader/InputStreamReader zu sein. Siehe dazu das folgende Beispiel (Ausgangspunkt der Sourcecode von oben):
ServerTest.java:
ServerThread.java:
Ich hab hier einfach nur zwei Zeilen hinzugefügt:
System.out.println("Sleepy");
Thread.sleep(8000);
Versuche ich jetzt mit 2 Threads gleichzeitig auf localhost:1234 zuzugreifen, dann wird die Anfrage nacheinander durchgeführt, d.h. erst nach 8 vollen Sekunden beginnt der Thread mit der zweiten Abarbeitung obwohl beide Anfragen fast gleichzeitig durchgeführt wurden.
Woran liegt das und vor allen Dingen: wie kann ich das umgehen?
In weiterer Folge geht es mir darum: ich hab einen Java Server der mir Daten aufbereitet. Während dieser Datenaufbereitung ist der Server busy und alle weiteren Anfragen sollen über diesen Zustand informiert werden. Derzeit werden einfach alle Anfragen "gestaut" und ich weiß nicht, wie ich damit umgehen kann/soll.
hab wegen des Problems bereits einen Thread offen, aber ich denke mit dem FAQ Beitrag von euch lässt es sich besser erklären:
Netzwerkgrundlagen - ServerSocket und Socket
Ausgangspunkt ist also das anschauliche Beispiel bei 4. Threads und Server:
(Copy+Paste)
Server
Java:
[...]
// Server aufbauen
ServerSocket server = new ServerSocket(1234);
Socket s;
while(true) {
// Auf verbindung warten
s = server.accept();
// kommunikation an einen nebenläufigen Thread abgeben
ServerThread t = new ServerThread(s);
t.start();
// und wieder auf neue Verbindungen warten
}
ServerThread:
Java:
public class ServerThread extends Thread {
private Socket s;
public ServerThread(Socket s) {
this.s = s;
}
public void run() {
// lesen
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
String text = in.readLine();
// schreiben
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
out.write(text.toUpperCase());
out.newLine();
out.flush();
// aufräumen
out.close();
in.close();
}
}
Es geht mir darum, wenn mein Server gerade beschäftigt ist (z.B. durch einen einfachen Thread.sleep(5000)), funktioniert die parallele Threadabarbeitung nicht mehr. Grund dafür scheint der BufferedReader/InputStreamReader zu sein. Siehe dazu das folgende Beispiel (Ausgangspunkt der Sourcecode von oben):
ServerTest.java:
Java:
package servertest;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(1234);
Socket s;
while (true) {
s = server.accept();
ServerThread t = new ServerThread(s);
t.start();
}
}
}
ServerThread.java:
Java:
package servertest;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ServerThread extends Thread {
private Socket s;
public ServerThread(Socket s) {
this.s = s;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
String text = in.readLine();
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
System.out.println("Sleepy");
Thread.sleep(8000);
out.write(text.toUpperCase());
out.newLine();
out.flush();
out.close();
in.close();
} catch (IOException | InterruptedException ex) {
Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Ich hab hier einfach nur zwei Zeilen hinzugefügt:
System.out.println("Sleepy");
Thread.sleep(8000);
Versuche ich jetzt mit 2 Threads gleichzeitig auf localhost:1234 zuzugreifen, dann wird die Anfrage nacheinander durchgeführt, d.h. erst nach 8 vollen Sekunden beginnt der Thread mit der zweiten Abarbeitung obwohl beide Anfragen fast gleichzeitig durchgeführt wurden.
Woran liegt das und vor allen Dingen: wie kann ich das umgehen?
In weiterer Folge geht es mir darum: ich hab einen Java Server der mir Daten aufbereitet. Während dieser Datenaufbereitung ist der Server busy und alle weiteren Anfragen sollen über diesen Zustand informiert werden. Derzeit werden einfach alle Anfragen "gestaut" und ich weiß nicht, wie ich damit umgehen kann/soll.
Zuletzt bearbeitet: