designfrage

Status
Nicht offen für weitere Antworten.

skywalker

Aktives Mitglied
hi,

ich hab da mal eine grundlegende design-frage.

also ich möchte ein netzwerk simulieren wo server über links clients nachrichten schicken, und clients wieder über links requesten und server wieder responsen:

a) die server sollen in kurzen abständen immer wieder broadcasten
b) die links sollen immer um eine gewisse zeit verzögern
c) die clients sollen aber ebenfalls in gewissen zeitabständen an die server nachrichten schicken (ebenfalls über den selben link

z.b. server1 --> link1 --> client1
server1 --> link2 --> client2
server1 --> link3 --> client3
server2 --> link4 --> client4
usw...

ich versuch das mit TimerTask zu implementieren

die server.class hat einen TimerTask der alle x sekunden broadcastet
die link.class hat einen TimerTask der um x sekunden verzögert
und die client.class hat einen TimerTask der alle x sekunden requests startet

die einzelenen objekte sollen alle unterschiedliche zeiten besitzen - z.b. server1 broadcastet alle 2 sek., server2 alle 5, link1 verzögert um 1 sek. link 2 um 5,.... das problem hab ich dann bei den clients - also genau ist das problem: ich hab keine ahnung wie ich das programm terminieren soll - der knackpunkt liegt momentan bei den clients - wenn der erste client fertig ist (also alle antworten auf seine requests bekommen hat) und ich mach ein timer.cancel sind alle client TimerTask weg - ist mir auch klar warum.

nur wie kann ich das nun so umbauen das das programm auf den "langsamsten" clients wartet und dann terminiert?

oder ist das mit TimerTask sowieso totaler schwachsinn und nicht schön lösbar?
 

Marco13

Top Contributor
Hab Timer+TimerTask ehrlich gesagt noch nie verwendet, aber .... irgendwie bin ich verwirt - welche TimerTasks liegen in WELCHEN Timern? (Und sind die mit scheduleAtFixedRate da reingelegt?) Also ... wieviele Instanzen von Timern und TimerTasks gibt es, und wo liegen sie?

wenn der erste client fertig ist (also alle antworten auf seine requests bekommen hat) und ich mach ein timer.cancel sind alle client TimerTask weg - ist mir auch klar warum.
Gibt es einen Client Timer oder mehrere? Wenn man einen Timer cancelt, sind alls TimerTasks weg, aber wenn man einen TimerTask cancelt wohl nicht der Timer...
 

skywalker

Aktives Mitglied
im server:
gibt es einen broadcasttask (TimerTask)
der task wird durch den timer schon im konstruktor mit scheduledAtFixedRate aufgerufen - da findet der broadcast der server statt. (warum im konstruktor? alle server werden dynamisch über ein konfigfile generiert und dort gibt man auch die einzelen raten in denen gebroadcastet werden soll an)

im link:
wird der verzögerungstask (timertask) durch den server über die methode aufgerufen die für das weiterleiten der nachricht vom server am link implementiert ist - der timer (also der task) wird gescheduled - also nach einem delay ausgeführt. der task ist für das weiterleiten an den client zuständig - eben nach einem bestimmten delay der vom timer gesteuert wird.

im client:
ist es so ähnlich wie beim server - der timer der den RequestTimerTask aufruft wird im konstruktor aufgerufen - wieder scheduledAtFixedRadt - der requestTask soll in gewissen abständen aufgerufen werden solange eine vordefiniert (wieder im konfig-file) anzahl von requests durchgeführt wurde.
und hier ist das problem - ein client wird als erster fertig und ich cancel den timer im timertask und schon sind alle anderen clients weg...
 

skywalker

Aktives Mitglied
schit - hab da gestern zu später stunde und zu lang vor der kiste sitzerei was vewechselt - ich hätte gemeint wenn ich ein system.exit(0) mach. das ist ja klar.

wenn ich mit timer.cancel() arbeit terminiert das programm eben nie. das ist mein grosses problem und die frage bzgl. design...
 

Marco13

Top Contributor
Das wird immer verworrener. Vielleicht hat noch jemand anderes eine Idee, oder du überlegst mal eine Weile, wie man die Frage vermitteln kann...
 

Ebenius

Top Contributor
Also da mir das hier zu sehr durcheinander geht beziehe ich mich einfach mal nur auf den Eingangsbeitrag. Des Himmelsläufers Beschreibung entnehme ich, dass in der Client-Klasse* eine TimerTask-Ableitung existiert, deren (beispielswiese 5) Instanzen auf dem selben Timer-Objekt laufen.

Vereinfacht sollte alles also ungefähr so aussehen und funktionieren: [HIGHLIGHT="Java"]public class MyTestClass {
final int DELAY = 100;

private static class ClientTimerTask extends TimerTask {

private final Timer timer;
private static int activeInstances = 0;

/** Creates a new {@code ClientTimerTask}. */
public ClientTimerTask(Timer timer) {
this.timer = timer;
synchronized (ClientTimerTask.class) {
activeInstances++;
}
}

@Override
public void run() {
// Do some stuff here

if (cancelConditionIsMet()) {
// This task will never run again
cancel();

// Synchronize access to the timer between multiple client timer
// task instances.
synchronized (ClientTimerTask.class) {
if (--activeInstances == 0) {
// We have been the last buddy, the timer will stop running
timer.cancel();
}
}
}
}

private boolean cancelConditionIsMet() {
return false; // return true, whenever you are ready
}
}

public static void main(String[] args) throws BadLocationException {
final Timer timer = new Timer();
for (int i = 0; i < 5; i++) {
// install the client timer tasks to the timer
timer.schedule(new ClientTimerTask(timer), DELAY, DELAY);
}
}
}[/HIGHLIGHT]
KlassenNamen werden immer CamelCase geschrieben.

Ebenius
 

skywalker

Aktives Mitglied
himmelläufer ist wieder da!

sorry - ich versteh die methode cancelConditionIsMet nicht ganz - könnt ich die von einer anderen klasse aus aufrufen und ein true schicken? wenn ja, wie?

was mir noch helfen würde - wie kann ich über klassen hinweg ein flag austauschen?
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben