1. 程式人生 > >java多執行緒模仿發牌的小程式

java多執行緒模仿發牌的小程式

package threadtest;


import java.util.*;


/**
 * desc:
 * User: weiguili([email protected])
 * 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;
    }
}













相關推薦

java執行模仿程式

package threadtest; import java.util.*; /** * desc: * User: weiguili([email protected]) * Date: 13-11-12 * Time: 下午2:24 */

Java執行實現簡單的售票程式

設計一個多執行緒程式如下:設計一個火車售票模擬程式。假如火車站要有100張火車票要賣出,現在有5個售票點同時售票,用5個執行緒模擬這5個售票點的售票情況 1、要求打印出每個售票點所賣出的票號 2、各售票點不能售出相同票號的火車票 package com.hebu

Android知識-Java執行的基礎知識瞭解下

本平臺的文章更新會有延遲,大家可以關注微信公眾號-顧林海,包括年底前會更新kotlin由淺入深系列教程,目前計劃在微信公眾號進行首發,如果大家想獲取最新教程,請關注微信公眾號,謝謝! 十月份離職,在家修養一個多月,這一個多月做了很多事,自己的微信公眾號開通了,部落格也換了一種風格,在簡書和掘金分享

Java 執行的一點問題

Java 多執行緒的一點小問題 使用了Runnable、Thread就必定是多執行緒? class XXRunnable implements java.lang.Runnable{ @Override public voi

Android知識-Java執行相關(執行間通訊)下篇

本平臺的文章更新會有延遲,大家可以關注微信公眾號-顧林海,如果大家想獲取最新教程,請關注微信公眾號,謝謝! 在一種場景中,比如main執行緒建立並啟動了子執行緒,子執行緒需要做耗時操作,如果main執行緒想等子執行緒執行完成之後再結束,由於main執行緒比子執行緒先執行完,因此main執行緒獲取不

java執行示例詳解

package com.chillax.controller; import java.io.IOException; public class MultiThread { public static void main(String[] args) { System.out.p

java執行的一些技巧,白必備!

什麼是多執行緒呢?多執行緒是為了使得多個執行緒並行的工作以完成多項任務,以提高系統的效率。執行緒是在同一時間需要完成多項任務的時候被實現的。 在Java中如何實現執行緒 在Java語言層面上只有兩種實現執行緒的方式。繼承java.lang.Thread類和實現java.lang.Runnab

Android知識-Java執行相關(Lock使用)

本篇文章已授權微信公眾號 顧林海 獨家釋出 在JDK1.5中新增ReentrantLock類,效果類似於使用synchronized關鍵字實現執行緒間同步互斥,並且在擴充套件功能上也更加強大,比如具有嗅探鎖定、多路分支通知等功能。看下面ReentrantLock的例項程式碼: public cl

關於Java執行執行同步和執行通訊的一些問題(順便分享幾篇高質量的博文)

一、對於執行緒同步和同步鎖的理解(注:分享了三篇高質量的部落格) 以下我精心的挑選了幾篇博文,分別是關於對執行緒同步的理解和如何選擇執行緒鎖以及瞭解執行緒鎖的作用範圍。 <一>執行緒同步鎖的選擇 2. 以上推薦的博文是以賣火車票為例,引出了非同步會導致的錯誤以及同步鎖(監視器)應該如果選擇,

java執行簡單例子2——實現Runnable介面

/** * 實現Runnable介面的類 * * @author */ public class DoSomething implements Runnable { private St

從火箭場景來學習Java執行併發閉鎖物件

從火箭發場景來學習Java多執行緒併發閉鎖物件 倒計時器場景 在我們開發過程中,有時候會使用到倒計時計數器。最簡單的是:int size = 5; 執行後,size—這種方式來實現。但是在多執行緒併發的情況下,這種操作會不安全的。舉個現實中最典型的一個例子:火箭發射的案例。 大家都看過火箭發射的直播吧。火箭在

Java執行實現電影院售票案例

某電影院目前正在上映賀歲大片,共有100張票,而它有3個售票視窗,請設計一個程式模擬該電影院售票。 定義Sell類實現Runnable介面,很好的解決了單繼承共享資源問題 public class Sell implements Runnable { // 定義100張票,三個售票

java執行物件鎖、類鎖、同步機制詳解

1.在java多執行緒程式設計中物件鎖、類鎖、同步機制synchronized詳解:     物件鎖:在java中每個物件都有一個唯一的鎖,物件鎖用於物件例項方法或者一個物件例項上面的。     類鎖:是用於一個類靜態方法或者class物件的,一個

Java 執行實現死鎖場景

簡述: 《Java 程式設計思想》  P718 ~ P722 模擬死鎖的場景, 三個人 三根筷子,每個人需要拿到身邊的兩根筷子才能開始吃飯 出現死鎖的場景是,三個人都拿到了右邊的筷子,但是由於筷子都被搶佔,均無法獲得左邊的筷子 Chopstick.java

Java 執行 join和interrupt 方法

簡述: 使用Java多執行緒中join和interrupt函式 《Java程式設計思想》 P669 ~ P670 一個執行緒可以再其他執行緒上呼叫join()方法,其效果是等待一段時間直到第二個執行緒結束才繼續執行。 如果某個執行緒在另一個執行緒t上呼叫t.join(), 此

Java 執行 CountDownLatch 試用

簡述: 使用Java多執行緒的庫,包括 ExecutorService執行緒池, CountDownLatch執行緒執行控制(知道所有啟動的執行緒呼叫完成後,函式才會繼續執行) package test.anialy.multithread; import java.ut

Java執行中Synchronized簡介和Static Synchronized的區別

在進行Java開發時,多執行緒的開發是經常會使用的。首先會問一個小問題啊,在Java中有幾種方法可以建立一個執行緒? 我給的答案是3種。(如果還有其他的請留言告訴我哈。) 1、建立直接繼承自Thread類建立執行緒子類。   步驟如下:a 定義一個子類,同時

Java執行學習與總結(Join)

join()方法的用法: join()是主執行緒 等待子執行緒的終止。也就是在子執行緒呼叫了 join() 方法後面的程式碼,只有等到子執行緒結束了才能執行。 例子如下: Java程式碼 p

Java執行學習與總結(ThreadGroup)

在Java中每個執行緒都屬於某個執行緒組(ThreadGroup)。例如,如果在main()中產生一個執行緒,則這個執行緒屬於main執行緒組管理的一員,您可以使用下面的指令來獲得目前執行緒所屬的執行緒組名稱: Java程式碼

Java執行-無鎖

1 無鎖類的原理詳解 1.1 CAS CAS演算法的過程是這樣:它包含3個引數CAS(V,E,N)。V表示要更新的變數,E表示預期值,N表示新值。僅當V 值等於E值時,才會將V的值設為N,如果V值和E值不同,則說明已經有其他執行緒做了更新,則當前執行緒什麼 都不做。最後,CAS返