lang Zeit Benutzer, zum ersten Mal Poster ...Wie richte ich einen Thread richtig ein, der in Java gecodiert werden soll?
Wie auch immer, ich fragte mich, wie man einen erstellten Thread zu GC'd einrichten. Ich habe einen einfachen Multithread-Server erstellt, um Verbindungen vom Client zu akzeptieren, aber jedes Mal, wenn ein Client eine Verbindung herstellt, wächst die Speicherauslastung um etwa 80 k ... verständlich. Das Problem ist, dass ich nicht weiß, wie ich von diesem schnellen Wachstum zurückkommen kann, nachdem der Client und der Server die Verbindung getrennt haben.
Hier ist die Hauptklasse, die den Thread einrichtet:
public static void main(String[] args) {
try {
serverSock= new ServerSocket(9999);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
while (true){
try {
Thread t = new server(serverSock.accept());
t.start();
t = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Und hier ist der grundlegende Server-Thread:
public class server extends Thread {
private Socket serverSocket = null;
public static String command = null;
public server(Socket serverSocket2) {
super("server");
serverSocket = serverSocket2;
}
@Override
public void run(){
BufferedReader fromClient = null;
PrintStream toClient = null;
String line = null;
String[] user = new String[2];
try {
serverSocket.setSoTimeout(10000);
fromClient = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
toClient = new PrintStream(serverSocket.getOutputStream());
System.out.println("Got connection");
System.out.println("Terminating server");
fromClient.close();
toClient.close();
serverSocket.close()
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
System.out.println("Connection established, but timeout on" +
" message recieve may have occured");
e.printStackTrace();
}
}
Nun, wie genau würde ich erlaube diesem Thema nur ... sterben und weggehen, anstatt das Speicherleck zu verursachen, das gerade auftritt?
Auch ich bin neu in Java - egal Thread zu verwenden, also wenn es offensichtlich ist, bitte versuchen Sie, nett darüber zu sein. Vielen Dank für Ihre Hilfe!
Das Setzen von 't' auf' null' hat keinerlei Wirkung, da der Block unmittelbar nach dieser Anweisung endet und 't' den Gültigkeitsbereich verlässt. @Pete: Was passiert, wenn Sie 't' auf' null' setzen, während der Thread läuft? Nichts wird dem Thread passieren. – Jesper
Ich hatte den Eindruck, dass, wenn wir nicht einen Zeiger auf die Thread-Unterklasse behielten, es GC'd werden könnte, nachdem es außer Geltungsbereich (wie jedes andere Objekt) ging. Ich denke nicht? – Pete