java多线程模仿发牌的小程序

package threadtest;


import java.util.*;


/**
 * desc:
 * User: weiguili(li5220008@gmail.com)
 * Date: 13-11-12
 * Time: 下午2:24
 */
public class ThreadTest2 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        PokerSender pokers=new PokerSender();
        Players a=new Players("A",pokers);
        Players b=new Players("B",pokers);
        Players c=new Players("C",pokers);
        Players d=new Players("D",pokers);
        a.setNext(b);
        b.setNext(c);
        c.setNext(d);
        d.setNext(a);
        a.start();
    }
}
//扑克发牌器
class PokerSender {
    public final int POKER_NUM = 52;//一共52张
    public final boolean IS_RAMDOM = false;//牌是否随机打乱
    public final int PLAY_NUM =4;//玩家数量
    public int sendNum =0;//已经发了多少张牌
    private List<Integer> poker = new ArrayList<Integer>();//扑克
    public List<Map<String,List<Integer>>> allHanderCards = new ArrayList<Map<String, List<Integer>>>(); //收集所有人手中的牌
    public  int getNext(){
        return sendNum++;
    }
    PokerSender(){
        setPokers();
    }
    public void showAllCards(){
        System.out.println(allHanderCards);
    }
    public synchronized void setPokers(){//从新洗牌
        for(int i =0;i<POKER_NUM; i++){
            poker.add(i);
        }
        if(IS_RAMDOM){ //如果随机则打散
            java.util.Random rand=new Random(); //随机数序列对象
            java.util.Collections.shuffle(poker, rand); //将列表的数据序列打散,按随机数序列
        }
    }


    public synchronized int sendPokers(int index){//同步发牌
        return poker.get(index);
    }
    public boolean isLastTurn(){//是否最后一轮
        return sendNum > getPokersNum()- PLAY_NUM;
    }
    public int getPokersNum(){
        return poker.size();
    }
}


//线程(也就是玩家)
class Players extends Thread {
    private PokerSender pokers;//扑克
    private Players next;//下一家
    public List<Integer> handerCards = new ArrayList<Integer>(); //发到手的牌
    public Players(String name, PokerSender poker){
        this.setName(name);
        this.pokers =poker;
    }
    public void setNext(Players next){
        this.next=next;
    }
    public void setHanderCards(int cards){
        handerCards.add(cards);
    }
    public void cllectAll(){
        if(pokers.isLastTurn()) { //最后一轮,收牌。
            Map<String,List<Integer>> map = new HashMap<String, List<Integer>>();
            map.put(getName(),handerCards);
            pokers.allHanderCards.add(map);
        }
    }
    public void showCards(){
        if(pokers.isLastTurn()) { //最后一轮,该摊牌了。
            System.out.println(handerCards);
        }
    }


    public void run(){
        int sendNum= pokers.getNext();
        while(sendNum<pokers.getPokersNum()){
            sendNum = getPoker(sendNum);
        }
        pokers.showAllCards();
        System.exit(0);
    }


    /**
     * 摸牌
     * @param sendNum 发了多少张牌
     * @return
     */
    private synchronized int getPoker(int sendNum) {
        System.out.println(getName()+"摸到牌"+sendNum);
        setHanderCards(pokers.sendPokers(sendNum));
        this.showCards();
        this.cllectAll();
        if(this.next.getState()== State.NEW){//第一轮 下一个线程如果还没开始则启动它
            this.next.start();
        }else{
            synchronized (this.next) {//唤醒下一个进程
                this.next.notify();
            }
        }
        try { //阻塞当前进程
            this.wait();
        } catch (Exception e) {
            e.printStackTrace();
        }
        sendNum= pokers.getNext();
        if(sendNum%pokers.PLAY_NUM ==0){
            System.out.println("--------------------完成"+sendNum/pokers.PLAY_NUM +"轮----------------");
        }
        return sendNum;
    }
}













  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多线程 求质数 返回数组中的最大值 bool isPrime(long x) { if (x <= 1) return false; if (x == 2) return true; for (long i = 2; i <= ceil(sqrt((long double)x));i++) if (x%i == 0) return false; return true; } DWORD WINAPI findPrime(void* p) { long result=0; int l = stc(p)->lower, u = stc(p)->uper; int t_id=GetCurrentThreadId(); for (int i = l; i <= u;i++) if (isPrime(i)) { result++; } DWORD dReturn = WaitForSingleObject(mutex_mul_result_h, INFINITE); mul_result += result; ReleaseMutex(mutex_mul_result_h); //EnterCriticalSection(&gCRITICAL_SECTION_Printf); //printf("%d,%d,%d,%d\n", l, u, result,t_id); //fflush(stdout); //LeaveCriticalSection(&gCRITICAL_SECTION_Printf); return 0; } //dispatcher void dispatch() { DWORD Status; timer tm; tm.start(); //srand(time(NULL)); long step = STEP;//ceil(double(TEST/10)); handlenum = 0; for (int i = 1; i <= TEST;) { i += step; handlenum++; } handle_array=new HANDLE[handlenum]; Thread_id = new DWORD[handlenum ]; arg = new FP_ARG[handlenum]; InitializeCriticalSection(&gCRITICAL_SECTION_Printf); mutex_mul_result_h = CreateMutex(NULL, false, mutex_mul_result); handlenum = 0; for (int i = 1; i <= TEST;) { arg[handlenum].lower = i; arg[handlenum].uper = (i + step-1>TEST) ? TEST : i + step-1; handle_array[handlenum]=(HANDLE)CreateThread(NULL, 0, findPrime, &arg[handlenum], 0, &Thread_id[handlenum]); /*EnterCriticalSection(&gCRITICAL_SECTION_Printf); printf("lower:%d uper:%d thread_id:%d\n", arg[handlenum].lower, arg[handlenum].uper,Thread_id[handlenum]); LeaveCriticalSection(&gCRITICAL_SECTION_Printf);*/ i += step; handlenum++; } tm.stop(); Sleep(1000); printf("there are %d threads\n", handlenum); printf("the multithreads use %f msc\n", tm.read()); } //the number of 1-1000000 Primenumber void s_finePrime() { timer tm; long result = 0; tm.start(); for (int i = 1; i <= TEST; i++) if (isPrime(i)) result++; tm.stop(); printf("Single thread result is %d\n", result); printf("Single thread use %f msc\n", tm.read()); } int _tmain(int argc, _TCHAR* argv[]) { dispatch(); WaitForMultipleObjects(handlenum, handle_array, true, INFINITE);//不起作用 printf("the multithreads reslut is %d\n", mul_result); CloseHandle(mutex_mul_result_h); DeleteCriticalSection(&gCRITICAL_SECTION_Printf); s_finePrime(); system("pause"); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值