Este artículo comparte el código específico para Java para implementar la función de captura de envolvente rojo para su referencia. El contenido específico es el siguiente
Ideas clave:
1. Agarrar sobres rojos implica operaciones concurrentes para varias personas, y se requiere sincronización para garantizar que los resultados de la operación multiproceso sean correctos.
2. Debido a la gran cantidad de personas en línea al mismo tiempo, desde la perspectiva del rendimiento, los jugadores no necesitan responder de manera oportuna para enviar solicitudes de sobre rojo, pero el servidor ejecutará la cola de sobre rojo regularmente.
El siguiente es el código principal y la descripción de la lógica de implementación
1. Cree una clase para representar el concepto de entidad de sobres rojos. Use directamente variables atómicas para garantizar la sincronización del aumento y la disminución. Las variables atómicas de Java son un mecanismo de sincronización de grano más fino. En situaciones altamente competitivas, el rendimiento del bloqueo excederá el rendimiento de las variables atómicas, pero en situaciones de competencia más realistas, las variables atómicas disfrutan de un mejor rendimiento.
clase pública springgift {rol de cadena privada; regalo de atomicinteger privado; public String getRole () {rol de retorno; } public void setRole (rol de cadena) {this.role = rol; } public atomicInteger getGift () {return Gift; } public void setGift (AtomicInteger Gift) {this.gift = regalos; } public int getRemainCount () {return this.gift.get (); }} 2. Use simulación de múltiples subprocesos para obtener sobres rojos al mismo tiempo. El servidor guarda los sobres rojos enviados por el jugador en una cola, y luego usa un trabajo para llevar la información del sobre rojo al jugador regularmente. Las solicitudes de agarre de la envoltura roja para cada lote de jugadores en realidad son operadas por el primer elemento de sobre rojo que aparece desde la cola, pero cuando el número actual de sobres rojos está vacío, el próximo sobre rojo aparecerá automáticamente (si corresponde).
prueba de clase pública {public static concurrentLinkedqueue <springgift> queue; Springgift estático público Currgift; public static atomicInteger count = new AtomiCiNTEGER (); La clase estática myThread implementa runnable {public void run () {handleEvent (); }} public static void main (string [] args) lanza la excepción {queue = new concurrentLinkedqueue <springgift> (); para (int i = 0; i <3; i ++) {springgift regal = new SpringGift (); regal.setrole ("rol"+i); Gift.setGift (nuevo AtomicInteger (50)); cola.add (regalo); } mythread myThread = new MyThread (); para (int i = 0; i <1000; i ++) {nuevo hilo (myThread) .Start (); } System.err.println ("recibido en total"+count.get ()); } private static springgift getGift () {// Evite que múltiples hilos salgan la cola al mismo tiempo sincronizado (cola) {// Si no hay bloqueo, ¡el número total de recuentos impresos es incorrecto! ! ! ! if (currgift == null || currgift.getRemainCount () <= 0) {currgift = queue.poll (); }} return CurrGift; } public static void handleEvent () {try {springgift obj = getGift (); if (obj == null || obj.getRemainCount () <= 0) {system.err.println ("no"); devolver ; } if (obj! = null && obj.getGift (). getAndDecrement ()> 0) {System.err.println ("Obtenga un sobre rojo"); count.getAndIncrement (); } Thread.sleep (500); // Simular y procesar otras operaciones} Catch (Exception e) {E.PrintStackTrace (); }}}La captura de pantalla de los resultados de ejecución es el siguiente
Cabe señalar que dado que el método getGift () aparece automáticamente el elemento de encabezado, el mecanismo de sincronización debe hacerse. De lo contrario, cuando múltiples solicitudes operan el último restante de una cierta envoltura roja al mismo tiempo, el número total de sobres rojos será incorrecto.
(Después de comentar sobre el código bloqueado, encontrará que el número total de impreso puede ser incorrecto!)
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.