Java多线程实现扑克牌发牌程序实例

import java.util.*;import java.awt.*;import javax.swing.*;public class CardBuffer //加互斥锁的缓冲区{ private int value; private boolean isEmpty=true; //value是否空的信号量 private int order=0; //信号量,约定取牌线程的次序 synchronized void put(int i) { while (!isEmpty) //当value不空时,等待 try { this.wait(); //等待 } catch(InterruptedException e) {} value=i; //当value空时,value获得值 isEmpty=false; //设置value为不空状态 notifyAll(); //唤醒所有其他等待线程 } synchronized int get(int order) //order是取牌线程约定的次序 { while (isEmpty || (this.order!=order)) //当value空或取牌次序不符时等待 try { this.wait(); } catch(InterruptedException e) {} isEmpty=true; //设置value为空状态,并返回值 notifyAll(); this.order=(this.order+1)%4; //加1使取牌次序轮转 return value; }}/*class Sender extends Thread //发牌线程类{ private CardBuffer cardbuffer; private int count; //牌数 public Sender(CardBuffer cardbuffer,int count) { this.cardbuffer=cardbuffer; this.count=count; } public void run() { for (int i=1; i<=this.count; i++) cardbuffer.put(i); }}*/class Receiver extends Thread //取牌线程类{ private CardBuffer cardbuffer; private JTextArea text; private int order; //信号量,约定取牌线程的次序 public Receiver(CardBuffer cardbuffer,JTextArea text,int order) { this.cardbuffer = cardbuffer ; this.text = text ; this.order = order; } public void run() { while(true) { text.append(" "+cardbuffer.get(this.order)); try { Thread.sleep(100); } catch(InterruptedException e) {} } }}class CardJFrame extends JFrame{ public CardJFrame() { super("发牌程序"); this.setSize(460,200); this.setLocation(300,240); this.setDefaultCloseOperation(EXIT_ON_CLOSE); Container container=this.getContentPane(); container.setLayout(new GridLayout(3,3)); //3行3列网格布局 container.add(new JPanel()); //网格布局的第1行第1列 JTextArea text[]=new JTextArea[4]; //显示牌号的4个文本区 Font font=new Font("Helvetica", Font.PLAIN, 16); for (int i=0; i<text.length; i++) { text[i]=new JTextArea(); text[i].setLineWrap(true); //设置文本区自动换行 text[i].setEditable(false); text[i].setFont(font); container.add(text[i]); container.add(new JPanel()); } this.setVisible(true); CardBuffer cardbuffer = new CardBuffer(); Sender s = new Sender(cardbuffer,52); s.setPriority(10); //设置最高优先级 s.start(); //启动发牌线程 for (int i=0; i<text.length; i++) (new Receiver(cardbuffer,text[i],i)).start(); //创建并启动4个取牌线程,优先级为5 } public static void main(String arg[]) { new CardJFrame(); }}//思修改发牌线程,发送由1~52组成的一个随机数序列。//class Sender extends Thread //发牌线程类{ private CardBuffer cardbuffer; private int count; //牌数 private java.util.ArrayList<Integer> list; //数组列表 public Sender(CardBuffer cardbuffer,int count) { this.cardbuffer=cardbuffer; this.count=count; list=new ArrayList<Integer>(); for (int i=1; i<=this.count; i++) list.add(new Integer(i)); //列表中添加整数对象 java.util.Random rand=new Random(); //随机数序列对象 java.util.Collections.shuffle(list, rand); //将列表的数据序列打散,按随机数序列 } public void run() {// for (int i=1; i<=this.count; i++)// cardbuffer.put(((Integer)list.get(i-1)).intValue());//或 Iterator<Integer> it=list.iterator(); //返回一个迭代器对象 while (it.hasNext()) //若有后继元素,使用迭代器遍历一个集合 cardbuffer.put((Integer)it.next()); //返回后继元素 }}

作者:http://www.loverseo.com

但要相信真诚的爱情,对爱情永远怀有单纯的向往。

Java多线程实现扑克牌发牌程序实例

相关文章:

你感兴趣的文章:

标签云: