Ich habe eine Frage (warum schreibe ich denn sonst hier rein?)
Ich programmiere zurzeit eine Straßenkreuzung (diejenigen, die sich vielleicht daran erinnern, dass ich schon mal eine Frage hier reingestellt habe vor langer langer Zeit wegen der Programmierung einer gewissen Straßenkreuzung - ja, ich bin immer noch dran
) und wollte dort zwei Threads, die zwei Ampeln zeichnen, synchron schalten. Aber da die Synchronisation durch das Schlüsselwort synchronized irgendwie nur dazu führt, dass nur ein Thread auf ein Element zur gleichen Zeit zugreifen kann (so in etwa, sorry für meine Ausdrucksweise, hoffe, ihr wisst was ich meine), ist das irgendwie nicht das, was ich selbst mit "Synchronisation" meine.
Ich würde gerne die beiden Threads, die jeweils eine Ampel zeichnen (rufen repaint()-Methode einer erweiterten JPanel-Klasse auf) so miteinander synchronisieren, dass der Thread, der zuerst "Gelb" gezeichnet hat in der Ampel, auf den anderen Thread wartet, der noch mit "Gelb" beschäftigt ist. Es ist also ungewiss, welcher Thread auf wen warten muss. Die sollen halt aufeinander warten, bevor sie was neues zeichnen. Hoffe, das ist verständlich ausgedrückt.
Wenn ich beide einfach gleichzeitig malen lasse, komplett unabhängig voneinander, kommt es vor, dass ein Thread dem anderen kurzzeitig mal hinterherhinkt, und das ist dann schon nicht so praktisch in einer Straßenkreuzung, wenn die eine Ampel, die genau das gleiche wie die andere Ampel anzeigen soll, eine Sekunde länger Gelb zeigt als die andere. (ok, Sekunde ist übertrieben, aber man merkt es definitiv, dass die beiden Ampeln nicht "synchron" laufen, da sie ja voneinander nichts wissen).
Habe mir das irgendwie so vorgestellt, dass ich ein Integer x habe, der von einem Thread erhöht wird, wenn er fertig ist mit malen, und dann darauf wartet, bis dieser erneut erhöht wird durch den anderen Thread. Wenn x also zweimal erhöht wurde, sind beide fertig, und beide können weitermalen. Vielleicht könnte man das mit "synchronized" verbinden? Aber irgendwie schaffe ich es nicht, diese Idee in Code umzusetzen.
Habe eine Testklasse geschrieben, damit ich euch nicht den kompletten Code der Straßenkreuzung geben muss. Analog zu dem "warten, bis andere fertig mit zeichnen ist" kann man hier sagen, dass der Thread, der zuerst bis zur Fünf gezählt hat, soll warten, bis der andere Thread bei der Fünf angekommen ist, EGAL welcher Thread das ist. Aber wie kann man sowas implementieren?
Komme da gerade überhaupt nicht weiter :/
Ich programmiere zurzeit eine Straßenkreuzung (diejenigen, die sich vielleicht daran erinnern, dass ich schon mal eine Frage hier reingestellt habe vor langer langer Zeit wegen der Programmierung einer gewissen Straßenkreuzung - ja, ich bin immer noch dran
Ich würde gerne die beiden Threads, die jeweils eine Ampel zeichnen (rufen repaint()-Methode einer erweiterten JPanel-Klasse auf) so miteinander synchronisieren, dass der Thread, der zuerst "Gelb" gezeichnet hat in der Ampel, auf den anderen Thread wartet, der noch mit "Gelb" beschäftigt ist. Es ist also ungewiss, welcher Thread auf wen warten muss. Die sollen halt aufeinander warten, bevor sie was neues zeichnen. Hoffe, das ist verständlich ausgedrückt.
Wenn ich beide einfach gleichzeitig malen lasse, komplett unabhängig voneinander, kommt es vor, dass ein Thread dem anderen kurzzeitig mal hinterherhinkt, und das ist dann schon nicht so praktisch in einer Straßenkreuzung, wenn die eine Ampel, die genau das gleiche wie die andere Ampel anzeigen soll, eine Sekunde länger Gelb zeigt als die andere. (ok, Sekunde ist übertrieben, aber man merkt es definitiv, dass die beiden Ampeln nicht "synchron" laufen, da sie ja voneinander nichts wissen).
Habe mir das irgendwie so vorgestellt, dass ich ein Integer x habe, der von einem Thread erhöht wird, wenn er fertig ist mit malen, und dann darauf wartet, bis dieser erneut erhöht wird durch den anderen Thread. Wenn x also zweimal erhöht wurde, sind beide fertig, und beide können weitermalen. Vielleicht könnte man das mit "synchronized" verbinden? Aber irgendwie schaffe ich es nicht, diese Idee in Code umzusetzen.
Habe eine Testklasse geschrieben, damit ich euch nicht den kompletten Code der Straßenkreuzung geben muss. Analog zu dem "warten, bis andere fertig mit zeichnen ist" kann man hier sagen, dass der Thread, der zuerst bis zur Fünf gezählt hat, soll warten, bis der andere Thread bei der Fünf angekommen ist, EGAL welcher Thread das ist. Aber wie kann man sowas implementieren?
Komme da gerade überhaupt nicht weiter :/
Java:
package threadtest;
public class ThreadTest extends Thread {
public static void main(String[] args) {
PrintDemo PD = new PrintDemo();
ThreadDemo T = new ThreadDemo(PD);
ThreadDemo T2 = new ThreadDemo(PD);
T.start();
T2.start();
}
}
Java:
package threadtest;
public class ThreadDemo extends Thread{
PrintDemo PD = new PrintDemo();
ThreadDemo(PrintDemo pd) {
PD = pd;
}
@Override
public void run() {
System.out.println("Starting " + this.getName());
PD.printCount(this.getName());
}
}
Java:
package threadtest;
public class PrintDemo {
public void printCount(String name) {
for (int i = 0; i < 10; i++) {
System.out.println("Counter --- " + i + " by: " + name);
}
}
}