Parmi les connaissances en filetage en Java, les programmes de vente de billets sont très classiques. Il y a aussi quelques problèmes dans le programme!
Exigences: Simuler 100 billets en vente en même temps dans 3 fenêtres.
Question 1: Pourquoi 300 billets sont-ils vendus?
Raison: Parce que les billets sont des données variables de membre non statiques et non statiques conserveront une seule pièce de données dans chaque objet, et il y aura trois pièces de trois objets de thread.
Solution: Partagez le numéro de billets pour trois objets de thread. Utilisez une modification statique.
Question 2: Y a-t-il un problème de sécurité de fil?
Solution aux problèmes de sécurité des filetages: Sun fournit un mécanisme de synchronisation de thread pour nous pour résoudre ce type de problème.
Comment synchroniser les fils Java:
Méthode 1: synchroniser les blocs de code
Méthode 2: fonction synchrone
Class Selltickets étend Thread {static int ticket = 1; // Le nombre de votes doit être défini comme statique ici. Sinon, les variables des membres non statiques et les données des variables des membres non statiques conserveront un élément de données dans chaque objet. Il y aura trois copies de trois objets threads. public SellTicketS (String ThreadName) {super (ThreadName); } public void run () {while (true) {synchronisé ("lock") {if (billets == 101) {// ou if (billets> 100) {System.out.println ("Les titres ont été vendus -_-.."); casser; } System.out.println (thread.currentThread (). GetName () + "Selli le" + billets + "billet de numéro"); Billets ++; / * if (billets == 101) {// mal. Lorsque le billet == 101, un seul fil saute. Les billets ++ existent dans les deux autres threads. casser; } / * if (thread.currentThread (). getName (). equals ("Window 2")) {// Window 2 ne peut vendre que dans le plus d'un seul billet, et la pause est terminée; } * /} //System.out.println(thread.currentThread (). GetName () + "Lock ..."); }}} classe publique Demo4 {public static void main (String [] args) {// Créer trois objets de thread et simuler trois fenêtres SellTickets s1 = new SellTicketS ("Window 1"); SellTicketS S2 = new SellTicket ("Window 2"); SellTicketS S3 = new SellTicket ("Window 3"); // Billetterie de thread ouverte S1.Start (); S2.Start (); S3.Start (); System.out.println ("Méthode principale ..."); }}