Este artigo compartilha o código específico para o Java para implementar a função Red Envelope Grab para sua referência. O conteúdo específico é o seguinte
Idéias -chave:
1. Pegar envelopes vermelhos envolve operações simultâneas para várias pessoas, e a sincronização é necessária para garantir que os resultados da operação com vários threads estejam corretos.
2. Devido ao grande número de pessoas on -line ao mesmo tempo, da perspectiva do desempenho, os jogadores não precisam responder em tempo hábil para enviar solicitações de envelope vermelho, mas o servidor executará regularmente a fila de envelope vermelho.
A seguir, é apresentado o código principal e a descrição da lógica de implementação
1. Crie uma classe para representar o conceito de entidade de envelopes vermelhos. Use diretamente variáveis atômicas para garantir a sincronização de aumento e diminuição. As variáveis atômicas de Java são um mecanismo de sincronização mais refinado. Em situações altamente competitivas, o desempenho da trava excederá o desempenho das variáveis atômicas, mas em situações de competição mais realistas, as variáveis atômicas desfrutam de melhor desempenho.
classe pública Springgift {função de string privada; Presente atômico privado; public String getRole () {Return função; } public void setRole (função da string) {this.role = função; } public atomicInteger getGift () {return presente; } public void setGift (atomicInteger presente) {this.gift = presente; } public int getRemAinCount () {return this.gift.get (); }} 2. Use simulação com vários threading para pegar envelopes vermelhos ao mesmo tempo. O servidor salva os envelopes vermelhos enviados pelo jogador em uma fila e, em seguida, usa um trabalho para empurrar as informações do envelope vermelho para o jogador regularmente. As solicitações de captura de envelope vermelho para cada lote de jogadores são realmente operadas pelo primeiro elemento do envelope vermelho apareceu na fila, mas quando o número atual de envelopes vermelhos estiver vazio, o próximo envelope vermelho aparecerá automaticamente (se houver).
Public class Test {public static concurrentLinkedQueue <Springgift> fila; Public Static Springgift Curgift; public static atomicinteger count = new atomicinteger (); classe estática mythread implementa runnable {public void run () {handleEvent (); }} public static void main (string [] args) lança exceção {fileue = new concurrentLinkedQueue <procergift> (); for (int i = 0; i <3; i ++) {springgift presente = new springgift (); presente.setRole ("função"+i); presente.setGift (New AtomicInteger (50)); fila.add (presente); } mythread mythread = new mythread (); for (int i = 0; i <1000; i ++) {new Thread (mythread) .start (); } System.err.println ("recebido no total"+contagem.get ()); } private estático Springgift getGift () {// impedem que vários threads apareçam a fila ao mesmo tempo sincronizados (fila) {// Se não houver bloqueio, o número total de contagens impressas está incorreto! ! ! ! if (currgift == null || curgift.getRemAinCount () <= 0) {currgift = fileue.poll (); }} retorna currgift; } public static void handleEvent () {try {springgift obj = getGift (); if (obj == null || obj.getRemAinCount () <= 0) {System.err.println ("não"); retornar ; } se (obj! count.getAndIncrement (); } Thread.sleep (500); // simular e processar outras operações} catch (Exceção e) {e.printStackTrace (); }}}A captura de tela dos resultados em execução é a seguinte
Deve -se notar que, como o método getGift () aparece automaticamente no elemento de cabeçalho, o mecanismo de sincronização deve ser feito. Caso contrário, quando várias solicitações operam o último restante de um certo envelope vermelho ao mesmo tempo, o número total de envelopes vermelhos estará incorreto.
(Depois de comentar sobre o código bloqueado, você descobrirá que o número total de impressos pode estar incorreto!)
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.