-->
当前位置:首页 > 题库 > 正文内容

程序填空题:利用线程间通信解决单缓冲的生产-消费问题

Luz4年前 (2021-10-26)题库2214
以下程序模拟了”使用线程间通信解决单缓冲的生产-消费问题“的过程。其中,缓冲区只容纳一个字符,生产者按照 ABCD 的顺序将字符放入缓冲区,消费者从缓冲区取出字符。请阅读程序,并完成填空。

//类1:共享缓冲区
class SharedData {
private char c;//单缓冲(只能放 1 个产品)
private boolean isProduced=false;//(标志)是否有产品在缓冲
//方法1:放产品到缓冲区
public synchronized void push(char c) {
if(this.isProduced) {
try {
System.out.println("产品"+this.c+"还未消费,不能生产");

} catch ( ) {
System.out.println ( e ) ;
} catch ( Exception e ) {
System.out.println ( e ) ;
}
}
this.c=c;
this.isProduced=true;
//此行代码与填空 3 相同
System.out.println("生产了产品"+c+",并通知了消费者");
}
//方法2:从缓冲区取产品
public synchronized char get() {
if(!this.isProduced) {
try {
System.out.println("还未生产,不能消费");
//此行代码与填空 1 相同
} catch ( //此处代码与填空 2 相同 ) {
}
}
this.isProduced=false;

System.out.println("消费了产品"+c+",并通知了生产者");
return this.c;
}
}
//类2:消费者(线程)
class Consumer extends Thread {
private SharedData s;
public Consumer(SharedData s) {
this.s = s;
}
public void run() {
char ch;
do {
try {
Thread.sleep((int)Math.random()*3000);//随机延时
} catch ( //此处代码与填空 2 相同 ) {
}
;//从共享缓冲区取产品消费
}while(ch!='D');
}
}
//类3:生产者(线程)
class Producer extends Thread {
private SharedData s;
public Producer(SharedData s) {
this.s = s;
}
public void run() {
for(char ch='A';ch<='D';ch++) {
try {
Thread.sleep((int)Math.random()*3000);//随机延时
} catch ( //此处代码与填空 2 相同 ) {
e.printStackTrace();
}
;//产品入共享缓冲区
}
}
}
//主类:测试程序
public class Main {
public static void main(String[] args) {
SharedData s=new SharedData();//共享缓冲区
Producer p=new Producer(s);
Consumer c=new Consumer(s);
p.start();
c.start();
}
}








答案:
第1空:wait()

第2空:InterruptedException e

第3空:notify()

第4空:ch=s.get()

第5空:s.push(ch)

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。