分享斗地主的多线程实现的算法,为了理解多线程

package com.lpc.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class Poker {

   private static int tager = 1;
   private static String[] poker = { "黑桃A", "黑桃2", "黑桃3", "黑桃4", "黑桃5", "黑桃6",
         "黑桃7", "黑桃8", "黑桃9", "黑桃10", "黑桃J", "黑桃Q", "黑桃K", "红桃A", "红桃2",
         "红桃3", "红桃4", "红桃5", "红桃6", "红桃7", "红桃8", "红桃9", "红桃10", "红桃J",
         "红桃Q", "红桃K", "方块A", "方块2", "方块3", "方块4", "方块5", "方块6", "方块7",
         "方块8", "方块9", "方块10", "方块J", "方块Q", "方块K", "梅花A", "梅花2", "梅花3",
         "梅花4", "梅花5", "梅花6", "梅花7", "梅花8", "梅花9", "梅花10", "梅花J", "梅花Q",
         "梅花K", "大王", "小王" };

   private static List<String> list = new ArrayList<String>();

   public static void main(String[] args) {
      for (String s : poker) {
         list.add(s);
      }
      Collections.shuffle(list);
      AtomicInteger synObj = new AtomicInteger(0);

      TestPrint a = new TestPrint(synObj, "A", 0, list,new Call() {

         @Override
         public void result(List<String> list) {
            System.out.println("A拿到的牌是"+list);
         }
      });
      TestPrint b = new TestPrint(synObj, "B", 1, list,new Call() {

         @Override
         public void result(List<String> list) {
            System.out.println("B拿到的牌是"+list);
         }
      });
      TestPrint c = new TestPrint(synObj, "C", 2, list,new Call() {

         @Override
         public void result(List<String> list) {
            System.out.println("C拿到的牌是"+list);

         }
      });

      a.start();
      b.start();
      c.start();
   }


}

interface Call{
   public void result(List<String> list);
}
class TestPrint extends Thread {

   private AtomicInteger synObj;
   private String name;
   private int flag;
   private int count = 0;
   private Call call;
   private List<String> list;
   private List<String> mylist = new ArrayList<String>();

   public TestPrint(AtomicInteger synObj, String name, int flag,List<String> list,Call call) {
      this.list = list;
      this.synObj = synObj;
      this.name = name;
      this.flag = flag;
      this.call = call;
   }

   @Override
   public void run() {
      while (true) {
         synchronized (synObj) {
            if (synObj.get() % 3 == flag) {
               synObj.set(synObj.get() + 1);
               System.out.println(name);
               System.out.println(list);
               if (list.size() > 0) {
                  System.out.println("拿到的牌是" + list.get(0));
                  mylist.add(list.get(0));
                  list.remove(0);
               }
               count++;
               synObj.notifyAll();
               // 起牌 起17次;
               if (count == 17) {
                  call.result(mylist);
                  break;
               }
            } else {
               try {
                  synObj.wait();
               } catch (InterruptedException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               }
            }
         }
      }
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值