Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
public class WTF {
static boolean condition = true;
private static void foo(final int width, final int height) {
System.out.println("Funktion aufgerufen");
if (! condition) {
System.out.println("Funktion ausgeführt");
} else {
new Thread() {
public void run() {
System.out.println("Schleife betreten");
while (condition) {
// System.out.println("Schleife...");
}
System.out.println("Schleife verlassen");
foo(width, height);
System.out.println("Thread beendet");
}
}.start();
}
}
public static void main(String[] args) throws InterruptedException {
foo(300, 200);
Thread.sleep(5);
condition = false;
System.out.println("Variable geandert [condition=false]");
}
}
Funktion aufgerufen
Schleife betreten
Variable geandert [condition=false]
static volatile boolean condition = true;
Sehr cool. So etwas in der Art hatte ich auch im Kopf, bin aber nicht darauf gekommen. Danke!Du müßtest volatile verwenden:
GrußJava:static volatile boolean condition = true;
das Hauptproblem an deinem boolean ist aber die fehlende Threadsicherheit.
Du machst die Swing-Unzulänglichkeit kein Stück besser,
wenn du ein genau so problematisches bool noch dazu machst.
synchronized-Zugriff wäre schon eher was.
Okay, dass AWT nicht threadsicher ist, weiß ich, aber bei Swing bin ich bisher vom Gegenteil ausgegangen.
A note on thread safety:
It may seem strange that such an important part of the Java platform is not thread safe. It turns out that any attempt to create a thread-safe GUI library faces some fundamental problems. For more on this issue, see the following entry in Graham Hamilton's blog: MultiThreaded toolkits: A failed dream?
Das hat mit threadsicher nichts zu tun. Ein Stück Code kann threadsicher sein oder nicht, aber kein Datentyp. Der Datentyp Zugriff kann höchstens atomar erfolgen oder auch nicht...Aber wie kann ein boolean nicht threadsicher sein? Das ist doch nur ein einziges Bit.
Deswegen gibt es in deinem Code auch kein Problem mit der Variablen und dem Zugriff darauf an sich.Und in meinem Programm hat nur ein Thread einen schreibenden Zurgiff darauf...
Ja, z.B. Prozessor. Auf einem Single-Core Prozessor System hat der Prozessor die einzige Kopie einer Variablen, auf einem Multiple-Core / Multi-Prozessor System hat u.U. jeder Prozessor eine Kopie der Variablen. Deswegen muss man den Prozessor mit bestimmten Anweisungen zwingen immer auf die Speicherinformation direkt und nicht auf den (gecachten) lokalen Wert zuzugreifen, damit der Wert immer aktuell gehalten wird.Wie kommt es eigendlich, dass das Programm auf manchen PCs auch ohne volatile funktioniert? Liegt das am Prozessor?
Es gibt auch in der Java Spezifikation "kann" und "darf" Bestimmungen. Ein Compiler bzw. der Bytecode-Interpreter oder JIT-Compiler kann, bzw. darf bestimmte Dinge (z.B. zur Optimierung) tun, welche letztendlich unter best. Umständen (bei unsauberer Programmierung) zu anderem Verhalten führen.Java sollte doch eigendlich auf allen Geräten gleich arbeiten.