生产者消费者问题
一. 实验目的:
1. 掌握进程(线程)的同步与互斥 2. 掌握生产者消费者问题的实现方法 3. 掌握多线程编程方法
二.相关函数:
Java提供一系列类和函数用于实现多线程编程以及线程的互斥与同步。 (1) 定义线程类 在Java中,可以通过继承Thread类或实现Runnable接口来定义一个线程类。这里仅给出通过实现Runnable接口定义线程类的例子: class MyThread1 implements Runnable { public void run(){ //必须实现该方法
}
//在这里定义线程的执行代码。
}
(2) 启动线程
由于上面例子给出的线程类是通过实现Runnable接口来定义,要启动这样的线程,还是要依靠Thread类来完成,Thread类的构造方法中提供一个接收Runnable实例对象的方法。代码如下: MyThread1 myThread1 = new MyThread1(); Thread thread1 = new Thread(myThread1); thread1.start();
(3) 互斥控制
通过synchronized关键字可以将一个方法声明为互斥的方法,即同一时间内只能有一个线程进入该方法的代码执行。例如:
public synchronized void get(){ //临界区 }
(4) 同步控制
Object类是所有类的父类,该类中提供了实现线程同步的方法: ? 线程等待:
public final void wait() throws InterruptedException ? 唤醒第一个等待的线程:
public final void notify()
三.实验内容:
1.通过小程序ThreadExample(见附件)掌握创建多线程的方法 2.实现生产者消费者问题。
(1)假设循环缓冲队列共有10个缓冲单元。
(2)生产者线程的工作:生产出一个产品(即产生一个产品编号),按
顺序往缓冲队列中“空”的缓冲单元放产品,并将该缓冲单元置“满”标识(可以用1 来表示)。
(3)消费者线程与的工作:从缓冲队列装有产品的缓冲单元中取出一个
产品(即产品编号),将该缓冲单元置“空”标识(可以用0来表示)。
(4)保证两个线程间的互斥和同步
(5)在界面上打印缓冲队列的变化情况。
四.详细代码:
public class Mythread {
public void printInfo(String productID, String cell, Queue queue) {
this.stringBuffer.setLength(0);
if ((\.equals(queue.info[Integer.parseInt(cell)][1]))
||
}
for (int i = 0; i < 10; i++) { }
ui.jTextArea_info.setText(this.stringBuffer.toString());
for (int j = 0; j < 3; j++) { }
this.stringBuffer.append(\);
if (\.equals(queue.info[i][j])) { }
this.stringBuffer.append(\ + queue.info[i][j]);
break;
private UI ui;
private StringBuffer stringBuffer = new StringBuffer();
public void print(int productID, String cell, Queue queue) {
this.stringBuffer.setLength(0); this.stringBuffer
.append(\生产者将产品\
+ productID + \放入缓冲单元\ + cell
+ \。\\n\\n 缓冲单元编号 产品
编号 缓冲单元状态\\n\);
(\.equals(queue.info[Integer.parseInt(cell)][2]))) { return;
}
}
}
this.stringBuffer
.append(\消费者将产品\
+ productID + \从缓冲单元\ + cell
+ \中取出。\\n\\n 缓冲单元编号
产品编号 缓冲单元状态\\n\);
for (int i = 0; i < 10; i++) { }
ui.jTextArea_info.setText(this.stringBuffer.toString());
for (int j = 0; j < 3; j++) { }
this.stringBuffer.append(\);
if (\.equals(queue.info[i][j])) { }
this.stringBuffer.append(\ + queue.info[i][j]);
break;
public void printLog(String string) { }
ui.jTextArea_log.append(string); ui.jTextArea_log.selectAll();
五.实验结论:
在本次的实验中我多线程的编程方法,了解了进程(线程)的同步与互斥原理,参照老师所给的java多线程例子编写代码,大体上实现了实验要求的内容。但由于思考不够充分对于生产者消费者的生产消费过程的同步控制不够完善,在此进行自我的反省,在接下来的实验我会更严格的要求自己完成每一个实验要求。