Эта статья разделяет конкретный код для Java для реализации функции захвата Red Overvelope для вашей ссылки. Конкретный контент заключается в следующем
Ключевые идеи:
1. Захват красных конвертов включает в себя одновременные операции для нескольких человек, и необходима синхронизация, чтобы обеспечить правильные результаты работы с многопоточной работой.
2. Из -за большого количества людей онлайн одновременно, с точки зрения производительности, игрокам не нужно своевременно отвечать, чтобы отправлять запросы на красный конверт, но сервер будет регулярно выполнять очередь красного конверта.
Ниже приведен основной код и описание логики реализации
1. Создайте класс для представления концепции сущности красных конвертов. Непосредственно используйте атомные переменные, чтобы обеспечить синхронизацию увеличения и уменьшения. Атомные переменные Java представляют собой более мелкозернистый механизм синхронизации. В высококонкурентных ситуациях производительность блокировки превысит производительность атомных переменных, но в более реалистичных ситуациях соревнования атомные переменные имеют лучшую производительность.
Public Class SpringGift {частная строковая роль; частный подарок AtomicInteger; public String getRole () {return Role; } public void setrole (строковая роль) {this.role = role; } public atomicinteger getGift () {return gift; } public void setGift (AtomicInteger Gift) {this.gift = подарок; } public int getRemaInCount () {return this.gift.get (); }} 2. Используйте многопоточное симуляцию, чтобы одновременно захватить красные конверты. Сервер сохраняет красные конверты, отправляемые игроком в очереди, а затем использует задание, чтобы регулярно передавать информацию о красной конверте игроку. Запросы на захват Red Overvelope для каждой партии игроков фактически управляются первым элементом Red Overvelope, вытекающим из очереди, но когда текущее количество красных конвертов пустое, будет автоматически появляться следующая красная конверт (если есть).
Общедоступный тест {public static coundrentLinkedQueue <SpringGift> очередь; общественный статический весенний Curgift; Общественный статический Atomicinteger Count = новый AtomicInteger (); Статический класс Mythread реализует Runnable {public void run () {handleevent (); }} public static void main (string [] args) бросает исключение {queue = new complorentLinkedQueue <SpringGift> (); for (int i = 0; i <3; i ++) {springgift подарок = new Springgift (); Gift.Setrole («Роль»+I); Gift.SetGift (новый AtomicInteger (50)); queue.add (подарок); } mythread mythread = new mythread (); for (int i = 0; i <1000; i ++) {new Thread (mythread) .start (); } System.err.println ("получен в общей сложности"+count.get ()); } частная статическая пружина getGift () {// предотвратить несколько потоков в очереди одновременно синхронизированным (queue) {// Если нет блокировки, общее количество печатных счетов неверно! ! ! ! if (currgift == null || currgift.getRemainCount () <= 0) {currgift = queue.poll (); }} вернуть Currgift; } public static void handleevent () {try {SpringGift obj = getGift (); if (obj == null || obj.getRemainCount () <= 0) {System.err.println ("не"); возвращаться ; } if (obj! = null && obj.getGift (). getAndDecrement ()> 0) {System.err.println ("Получить красный конверт"); count.getandIncrement (); } Thread.sleep (500); // Моделировать и обрабатывать другие операции} catch (Exception e) {e.printStackTrace (); }}}Скриншот результатов бега выглядит следующим образом
Следует отметить, что, поскольку метод getGift () автоматически всплывает элемент заголовка, механизм синхронизации должен быть выполнен. В противном случае, когда несколько запросов выполняют последнюю оставшуюся часть определенного красного конверта одновременно, общее количество красных конвертов будет неверным.
(После комментирования заблокированного кода вы обнаружите, что общее количество печати может быть неверным!)
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.