}
pictureProduce.setBounds(x[0], y[0], 120, 120);//再次设置生产图片位置
}
else {
x[0]=20;
b[0]=false;//为空则不能生产 }
//只要消费者图片不为空就可以显示 if(pictureConsume!=null) {
pictureConsume.setBounds(x[1], y[2], 120, 120); }
else {
x[1]=20; b[1]=false; }
//如果缓冲区满了,则不可生产 if(isfull()) {
b[0]=false; }
repaint(); }
定义set_x函数来控制图片横坐标位置: public boolean set_x(int i,int n) {
if(b[i]==true) {
//设置生产者与消费者的横坐标,不断向前 x[i]=n;
//设置生产者生产完成回到起点 if(n>=599&&i==0) {
x[0]=20;//生产者回到起点
Id.push(pictureProduce);//添加到栈中添加一个产品,此时缓冲区并没有产品
image=produce();
pictureProduce=new JLabel(image); add(pictureProduce); }
}
else if(n==20&&i==1||n>=599&&i==1) {
if(n==20&&i==1)//如果是可以消费 {
if(!Id.isEmpty())//当缓冲区不为空时,可以消费 pictureConsume=consume(); else
pictureConsume=null; }
//System.out.println(n); if(x[1]>=599&&i==1) {
pictureConsume.setVisible(true); x[1]=20; } }
return true; }
else return false;
四、 上机调试总结与分析;
调试结果显示:生产者消费者问题的基本功能已经实现,基本没有bug。
五、 用户使用说明;
点击“开始生产”则图片开始运动,表示正在生产,图片运动出生产矩形之
后,表示生产完成,此时缓冲区则显示一个图片。点击“停止生产”则生产进程停止。
点击“开始消费”则缓冲区会少一个产品,表示从缓冲区取走了一个产品消费,同时图片开始在消费矩形之中运动,运动出消费矩形之后停止。点击“停止消费”则消费进程停止。
六、 测试数据与测试结果等内容。 测试结果如下:
初始界面
生产出一个产品之后继续生产
一边生产一边消费
七、 课程设计总结
从这次的课程设计我还是有很多收获的,首先是对于生产者消费者问题有了更深刻的了解,这个问题是典型的多线程问题,在学习java的时候,老师经常讲这个问题,但那时只是知道大概是什么意思。通过这次自己动手模拟这个问题,我才知道生产者消费者问题其实主要考虑缓冲区的问题,缓冲区满则不可生产,缓冲区空则不可消费。
其次,我对于java的线程的使用也熟悉了很多,线程是java的重点和难点,但是我们平时并没有对于线程做很多的练习,所以对于线程可谓是一知半解。通过这次的实验,我使用了多线程的技术,对于的线程的应用方法以及编写方法有了比较深入的了解。以后再遇见线程问题应该可以游刃有余了。
八、附录程序清单
1.DrawPanel类代码
import java.awt.Color; import java.awt.Font; import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.util.Stack;
import java.util.function.Consumer;
import javax.jws.soap.SOAPBinding.Style; import javax.swing.Icon;
import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane.IconifyAction;
import org.omg.CORBA.IRObjectOperations;
public class DrawPanel extends JPanel implements ActionListener//面板类用于绘图及事件处理 {
private Icon image=null;
private Stack
boolean b[]=new boolean[2];//设置两个状态标识,b[0]为true是可以生产,b[1]为true是可以消费
private int max=7;//缓冲区最大值
private mythread threadProduce;//生产者线程 private mythread threadComsume;//消费者线程 private JButton btStartProduce; private JButton btnStartCosume; private JButton btnStopConsume; private JButton btnStopProduce; private JLabel pictureProduce; private JLabel pictureConsume; //private JLabel nameAndId; int x[]=new int[2];
public int get_x(int i)//得到生产、消费横坐标 {
return x[i]; }
public boolean set_x(int i,int n) {
if(b[i]==true) {
//设置生产者与消费者的横坐标,不断向前 x[i]=n;