Mit der Timer
Klasse (java.util.Timer
) ist Multithreading auch. Es scheint potenziell geeignet für eine Anwendung wie diese, obwohl Multithreading eine erhebliche Anzahl von möglichen Fallstricken einführen kann. Sie könnten eine Timer
erstellen und dann eine TimerTask
zu Beginn einer Frage einplanen, die ein Flag markiert, um anzuzeigen, dass die Frage falsch ist, und zukünftige Antwortversuche zu akzeptieren (oder mit der nächsten Frage fortzufahren) tritt ein. Dies würde das Erstellen einer Unterklasse von TimerTask
erfordern, die die abstrakte Methode run()
implementiert, um die gewünschte Aktion auszuführen (die Frage wird als falsch markiert usw.). Möglicherweise möchten Sie den Zeitgeber auch für andere Aufgaben verwenden (z. B. um dem Benutzer einen Moment zu geben, die Tatsache zu verarbeiten, dass die Zeit für eine Frage überschritten wurde, bevor Sie mit der nächsten fortfahren).
Die Grundströmung eines Timer
(wie in dem obigen Beispiel angegeben) ist eine Unterklasse von TimerTask
Implementierung run()
zu schaffen, was Aufgabe auszuführen irgendwann am Ende einiger Zeitdauer (oder wiederholt in einigen auftreten sollte Intervall, das Timer
s auch unterstützt). Dann instanziieren Sie eine Timer
und planen Sie eine Instanz dieser TimerTask
Unterklasse für die Ausführung zu einer bestimmten Zeit oder nach einem bestimmten Intervall (je nachdem, welche schedule
Methode von Timer
Sie aufrufen, um es zu planen). Sobald diese Zeit erreicht ist oder das Intervall abgelaufen ist, wird die von Ihnen implementierte Methode run()
im Hintergrundthread Timer
aufgerufen. Genauere Informationen über Timer
und
Sie müssen jedoch auf Fallstricke wie Race-Bedingungen achten (zum Beispiel, wenn Ihre Aufgabe war die Frage falsch zu markieren und dann Antworten deaktivieren, wenn der Benutzer antworten sollte eine Frage zwischen Ihrer Aufgabe, die es unrichtig markiert und dem Beantworten der Aufgabe, könnte Sie unerwartetes Verhalten bekommen). Dies ist eine der häufigsten Herausforderungen beim Schreiben von Multithread-Code. Wenn Ihre gesamte Programmlogik und Ihr Programmfluss einfach genug sind, kann ein sorgfältiger Entwurf der Aktionen, die die Aufgabe ausführt, in dieser Reihenfolge ausreichend sein, um diese Probleme zu vermeiden. Sie sollten jedoch mit größter Vorsicht im Umgang mit Aktualisierungen von verschiedenen Threads zu einer freigegebenen Komponente arbeiten (z. B. das Aktualisieren eines booleschen Werts, der angibt, dass die Frage von einer Zeitgeberaufgabe korrekt war oder nicht korrekt war).
Allgemeinere Multithreading wäre sicherlich verwendbar, obwohl Timer
scheint nützlich, dass es spezifischer für diese besondere Art von Aufgabe ist.
Als eine (aber sehr relevant) beiseite, warne ich stark davor, eine vollständige Methode für jede einzelne Frage, stilistisch gesprochen, da es zu einer großen Menge von doppeltem oder sehr ähnlichem Code führen kann. Stattdessen kann ein Ansatz wie das Erstellen einer Klasse für Fragen (insbesondere wenn alle Ihre Fragen ein ähnliches Format haben) bevorzugt werden, um beispielsweise eine neue Frage zu erstellen, indem einfach ein Konstruktor mit Fragetext und dem richtigen Index aufgerufen wird Antworten. Ihre Frageklasse könnte eine Methode enthalten, die die Antwort in Ihrem Beispielcode überprüft, die alle Fragen (als Klasseninstanzen) haben, ohne dass Sie sie für jeden neu schreiben müssen.