Dieser Artikel teilt den spezifischen Code für Java mit, um die Funktion Red Envelope Grab als Referenz zu implementieren. Der spezifische Inhalt ist wie folgt
Schlüsselideen:
1. Die Erstellung von roten Umschlägen beinhaltet gleichzeitige Operationen für mehrere Personen, und es ist eine Synchronisation erforderlich, um sicherzustellen, dass die Ergebnisse der Multi-Thread-Betriebsergebnisse korrekt sind.
2. Aus der Sicht der Leistung müssen die Spieler aus der Sicht der Leistung gleichzeitig nicht rechtzeitig reagieren, um rote Umschlaganforderungen zu senden, aber der Server wird die rote Hüllkurve regelmäßig ausführen.
Das Folgende ist die Hauptcode- und Implementierungslogikbeschreibung
1. Erstellen Sie eine Klasse, um das Entitätskonzept von roten Umschlägen darzustellen. Verwenden Sie direkt Atomvariablen, um die Synchronisation von Zunahme und Abnahme sicherzustellen. Die Atomvariablen von Java sind ein feinkörnigerer Synchronisationsmechanismus. In stark wettbewerbsfähigen Situationen wird die Leistung des Schlosses die Leistung der Atomvariablen übertreffen, aber in realistischeren Wettbewerbssituationen genießen Atomvariablen eine bessere Leistung.
öffentliche Klasse Springgift {private String -Rolle; privates Atomicinteger -Geschenk; public String getRole () {Return -Rolle; } public void setRole (String -Rolle) {this.role = Rolle; } public atomicInteger getgift () {return tour; } public void setGift (Atomicinteger Geschenk) {this.gift = Geschenk; } public int getRemainCount () {return this.gift.get (); }} 2. Verwenden Sie eine Multi-Threading-Simulation, um gleichzeitig rote Umschläge zu erfassen. Der Server speichert die roten Umschläge, die der Player in einer Warteschlange gesendet hat, und verwendet dann einen Job, um die roten Umschlaginformationen regelmäßig an den Spieler zu bringen. Die Anfragen des roten Umschlags für jede Stapel von Spielern werden tatsächlich durch das erste rote Umschlagelement aus der Warteschlange aufgetaucht. Wenn jedoch die aktuelle Anzahl der roten Umschläge leer ist, wird der nächste rote Umschlag automatisch angezeigt (falls vorhanden).
public class test {public static ContrentLinkedQueue <SPRINGGIFT> Warteschlange; öffentliches statisches Springgift Curgift; public static atomicinteger count = new atomicinteger (); statische Klasse mythead implementiert runnable {public void run () {HandleEvent (); }} public static void main (String [] args) löst eine Ausnahme aus {queue = new ConcurrentLinkedQueue <PRINDGIFT> (); für (int i = 0; i <3; i ++) {SpringGift Geschenk = new SpringGift (); Gift.SetRole ("Rolle"+i); Gift.SetGift (New Atomicinteger (50)); queue.add (Geschenk); } MyThread myThread = new MyThread (); für (int i = 0; i <1000; i ++) {neuer Thread (MyThread) .Start (); } System.err.println ("insgesamt empfangen"+count.get ()); } private statische Springgift getgift () {// verhindern, dass mehrere Threads gleichzeitig die Warteschlange herausholen (Warteschlange) {// Wenn keine Sperre vorhanden ist, ist die Gesamtzahl der gedruckten Zählungen falsch! ! ! ! if (currgift == null || currgift.getRemainCount () <= 0) {currgift = queue.poll (); }} return curgift; } public static void handleEvent () {try {SpringGift obj = getGift (); if (obj == null || obj.getRemainCount () <= 0) {System.err.println ("nicht"); zurückkehren ; } if (obj! count.getandIncrement (); } Thread.sleep (500); // simulieren und verarbeiten andere Operationen} catch (Ausnahme e) {e.printstacktrace (); }}}Der Screenshot der laufenden Ergebnisse ist wie folgt
Es ist zu beachten, dass der Synchronisationsmechanismus, da die Methode getGift () automatisch das Header -Element aufgreift. Andernfalls ist die Gesamtzahl der roten Umschläge falsch, wenn mehrere Anfragen gleichzeitig die letzte verbleibende rote Hülle betreiben.
(Nachdem Sie den gesperrten Code kommentiert haben, werden Sie feststellen, dass die Gesamtzahl der gedruckten möglicherweise falsch ist!)
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.