Hi,
ich bin gerade am mich in Threads einarbeiten.
Mein Problem ist folgendes:
Ich habe eine Klasse ConnectionManager, die dazu dient andere Computer im Netzwerk zu finden.
Sie hat die Methoden:
Der BroadcastThread sendet periodisch eine "hallo-hier-bin-ich" nachricht.
Wenn der ListenThread diese empfängt, fügt er den absender der ip-list hinzu und führt dann die runnable fnotifier aus.
Problem:
Wenn ich stopListening aufrufe und fnotifier null gesetzt wird, während der andere thread versucht, diesen aufzurufen, kann ich eine null-pointer-exception kriegen.
Ansatz: Monitor verwenden.
Wenn ListenThread eine Nachricht kriegt, betritt er den Monitor, überprüft ob running == true und wenn ja ruft er fnotifier auf. Anschliesend verlässt er den Monitor wieder.
Aber: Wie genau mache ich das?
Wenn ich schreibe: public synchronised void stopListening()...
und: public synchronised void neueNachricht()...
reicht das?
ich bin gerade am mich in Threads einarbeiten.
Mein Problem ist folgendes:
Ich habe eine Klasse ConnectionManager, die dazu dient andere Computer im Netzwerk zu finden.
Sie hat die Methoden:
Java:
public void startBroadcast(){
if (broadcastThread == null){
broadcastThread = new UDP_BroadcastThread();
broadcastThread.setDaemon(true);
broadcastThread.start();
}
}
public void stopBroadcast(){
if (broadcastThread != null){
broadcastThread.running = false;
broadcastThread = null;
}
}
public void startListening(Runnable notifier){
if (listenThread == null){
fnotifier = notifier;
listenThread = new UDP_ListenThread();
listenThread.setDaemon(true);
listenThread.start();
}
}
public void stopListening(){
if (listenThread != null){
listenThread.running = false;
ip_list.clear();
listenThread = null;
fnotifier = null;
}
}
Der BroadcastThread sendet periodisch eine "hallo-hier-bin-ich" nachricht.
Wenn der ListenThread diese empfängt, fügt er den absender der ip-list hinzu und führt dann die runnable fnotifier aus.
Problem:
Wenn ich stopListening aufrufe und fnotifier null gesetzt wird, während der andere thread versucht, diesen aufzurufen, kann ich eine null-pointer-exception kriegen.
Ansatz: Monitor verwenden.
Wenn ListenThread eine Nachricht kriegt, betritt er den Monitor, überprüft ob running == true und wenn ja ruft er fnotifier auf. Anschliesend verlässt er den Monitor wieder.
Aber: Wie genau mache ich das?
Wenn ich schreibe: public synchronised void stopListening()...
und: public synchronised void neueNachricht()...
reicht das?