Hoje, um amigo me fez uma pergunta de entrevista. Havia 5 pessoas pegando 5 envelopes vermelhos. Eles poderiam ser recompensados e implementados repetidamente usando programas com vários threads. Existem muitas maneiras de implementá -los. Gostaria de compartilhar minhas idéias: as características de bloquear filas são aplicadas.
/*** Criado por Zhanglinqiang em 2016/6/23. */ public class mytest {public static void main (string [] args) lança interruptedException {LinkedBlockingQueue <luckymoney> luckymoneys = new LinkedBlockingQueue <> (); Lista <TuTureTask> FutureTasks = new ArrayList <> (); // Prepare -se para pegar envelopes vermelhos para (int i = 0; i <5; i ++) {futureTask <ject> FutureTask = new FutureTask <> (new CatchLuckMoney (LuckyMoneys, "nome"+i), nulo); novo thread (futureTask, "nome"+i) .start (); FutureTasks.add (FutureTask); } Thread.sleep (5); // Verifique se o fio da captura do envelope vermelho está pronto aleatório = novo aleatório (100); // Envie 5 envelopes vermelhos para (int i = 0; i <5; i ++) {luckyMoneys.put (new luckymoney ("envelope vermelho"+i, aleatom.nextint (100) +1)); } // Aguarde até que o envelope vermelho seja agarrado enquanto (! Luckymoneys.isempty ()) {thread.sleep (1); } // encerrar o thread Red Envelope Grab para (FutureTask FutureTask: FutureTasks) {FutureTask.cancel (true); }}} classe CatchLuckMoney implementa Runnable {public CatchLuckMoney (LinkedBlockQueue <tuckymoney> luckymoneys, nome da string) {this.luckymoneys = LuckyMoNeys; this.name = nome; } Private LinkedBlockingQuee <tuckyMoney> LuckyMoneys; nome de string privado; @Override public void run () {while (! Thread.currentThread (). IsInterrupted ()) {luckymoney redpackage = null; tente {RedPackage = luckyMoneys.take (); } catch (interruptedException e) {// e.printStackTrace (); quebrar; } System.out.println (nome + "agarrado->" + redpackage); luckymoneys.remove (redpackage); } System.out.println ("END >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+Threadthread (). GetName ()); }} classe luckyMoney {public luckyMoney (nome da string, dinheiro inteiro) {this.name = name; this.Money = Money; } nome de string privado; dinheiro inteiro privado; @Override public string tostring () {return }} Efeito de corrida:
Conectado ao alvo VM, endereço: '127.0.0.1:8869', transporte: 'Socket' nome3 obtido -> luckyMoney {name = 'Red Envelope 0', dinheiro = 16} nome4 obtido -> LuckyMoney {Nome = 'Red Envelope 3', Money = 89} Nome Got -> LuckyMoney {Nome = ' -> LuckyMoney {name = 'Red Envelope 1', Money = 51} Nome3 Got -> LuckyMoney {Name = 'Red Envelope 4', Money = 92} end>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>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.