Unter den Threading -Kenntnissen in Java sind Ticketverkaufsprogramme sehr klassisch. Es gibt auch einige Probleme im Programm!
Anforderungen: Simulieren Sie 100 Tickets gleichzeitig in 3 Fenstern.
Frage 1: Warum werden 300 Tickets verkauft?
Grund: Da Tickets nicht statisch sind, werden nicht statische Mitgliedsdaten in jedem Objekt eine Daten beibehalten und drei Teile von drei Thread-Objekten bestehen.
Lösung: Teilen Sie die Ticketsnummer für drei Thread -Objekte. Verwenden Sie statische Änderungen.
FRAGE 2: Gibt es ein Problem mit Thread -Sicherheit?
Lösung für Fadensicherheitsprobleme: Sun bietet einen Fadensynchronisationsmechanismus für uns, um diese Art von Problem zu lösen.
So synchronisieren Sie Java -Threads:
Methode 1: Codeblöcke synchronisieren
Methode 2: Synchronfunktion
Klasse SellTickets erweitert Thread {statische Int -Tickets = 1; // Die Anzahl der Stimmen muss hier als statisch definiert werden. Andernfalls führen nicht statische Mitgliedsvariablen und nicht statische Mitgliedsvariablendaten ein Datenstück in jedem Objekt bei. Es werden drei Kopien von drei Thread -Objekten geben. public SellTickets (String -ThreadName) {Super (ThreadName); } public void run () {while (true) {synchronized ("lock") {if (tickets == 101) {// oder if (Tickets> 100) {System.out.println ("Titel wurden ausverkauft -_-..."); brechen; } System.out.println (Thread.currentThread (). GetName ()+"hat die"+Tickets+"Numberticket" gekauft); Tickets ++; /* if (Tickets == 101) {// falsch. Wenn Ticket == 101, springt nur ein Thread heraus. Tickets ++ existiert in den beiden anderen Threads. brechen; } /* if (thread.currentThread (). getName (). Equals ("Fenster 2")) {// Fenster 2 kann höchstens ein Ticket verkaufen, und die Pause ist vorbei; } */} //System.out.println(Thread.CurrentThread (). GetName ()+"lock ..."); }}} public class Demo4 {public static void main (String [] args) {// drei Thread -Objekte erstellen und drei Windows SellTickets s1 = neue SellTickets ("Fenster 1"); SellTickets S2 = neue SellTickets ("Fenster 2"); SellTickets S3 = neue SellTickets ("Fenster 3"); // Thread Ticketing S1.Start () öffnen; S2.Start (); S3.Start (); System.out.println ("Hauptmethode ..."); }}