当前位置: 首页 > >

昆明理工大学 java 试验报告 发牌程序

昆明理工大学信息工程与自动化学院学生实验报告
( 2011 课程名称:java 程序设计 年级、专业、班 计科 093 —2012 学年 第 1 学期 ) 2011 年 12 月 12 日 孙浩川 成绩

开课实验室:信自楼机房 445 学号 20091040 5310 姓名

实验项目名称 教 师 评 语
该同学是否了解实验原理: 该同学的实验能力: 该同学的实验是否达到要求: 实验报告是否规范: 实验过程是否详细记录:

发牌程序
A.了解□ A.强 □ A.达到□ A.规范□ A.详细□

指导教师
B.基本了解□ B.中等 □ B.基本达到□ B.基本规范□ B.一般 □

周兰江

C.不了解□ C.差 □ C.未达到□ C.不规范□ C.没有 □

教师签名: 年 月 日

一、上机目的及内容
发牌程序。

二、实验原理及基本技术路线图(方框原理图或程序流程图)
1.本程序使用【例题 7.9】修改而成。 2.以前给四个人发牌,现在修改为给三个人发牌。

三、所用仪器、材料(设备名称、型号、规格等或使用软件)
1 台 PC 及 eclipse 软件

四、实验方法、步骤(或:程序代码或操作过程) //【例7.9】 发牌程序。

import java.util.*; import java.awt.*; import javax.swing.*;

-1-

public class CardBuffer { private int value; private boolean isEmpty=true; private int order=0; 次序 synchronized void put(int i) { while (!isEmpty) try { this.wait(); } catch(InterruptedException e) {} value=i; 值 isEmpty=false; notifyAll(); } synchronized int get(int order) 序 { while (isEmpty || (this.order!=order)) 时等待 try { this.wait(); }
-2-

//加互斥锁的缓冲区

//value是否空的信号量 //信号量,约定取牌线程的

//当value不空时,等待

//等待

//当value空时,value获得

//设置value为不空状态 //唤醒所有其他等待线程

//order是取牌线程约定的次

//当value空或取牌次序不符

catch(InterruptedException e) {} isEmpty=true; 回值 notifyAll(); this.order=(this.order+1)%3; 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) {
-3-

//设置value为空状态, 并返

//加1使取牌次序轮转

//发牌线程类

//牌数

//取牌线程类

//信号量,约定取牌线程的

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(660,200); this.setLocation(300,240); this.setDefaultCloseOperation(EXIT_ON_CLOSE); Container container=this.getContentPane(); container.setLayout(new GridLayout(1,3)); 局 //container.add(new JPanel()); 第1行第1列 //网格布局的 //3行3列网格布

JTextArea text[]=new JTextArea[3]; 个文本区 Font font=new Font("Helvetica", Font.PLAIN, 16); for (int i=0; i<text.length; i++) {
-4-

//显示牌号的4

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(); 个取牌线程,优先级为5 } public static void main(String arg[]) { new CardJFrame(); } } //【思考题7-4】修改发牌线程,发送由1~52组成的一个随机数序列。 //例12.1 class Sender extends Thread { private CardBuffer cardbuffer; private int count;
-5-

//设置文本区

//设置最高优

//启动发牌线

//创建并启动4

//发牌线程类

//牌数

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()); 素 } }

//返回一个迭代

//若有后继元

//返回后继元

-6-

五、实验过程原始记录( 测试数据、图表、计算等)

六、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必 须用计算纸或程序运行结果、改进、收获) 通过此次试验,熟练掌握 java 线程及进程的调用,以及定义好的类和方法,为以后的 程序设计奠定基础。进一步了解了类和对象的关系,在实际应用中如何通过方法之间的调用 实现各种功能。由于是第一次进行实际程序设计,难免存在不少困难,通过看书、上网等方 式查找资料,使得所遇到的难题一一*猓 java 语言有了新的认识。

注:教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。

-7-




友情链接: year2525网 工作范文网 QS-ISP 138资料网 528200 工作范文网 baothai 表格模版