生产与消费多线程程序, 编写电影院生产10个电影,一边生产(播放)一边消费(观看)。
如图效果:
共享资源:电影
class Movie {
private String name;
// 信号灯
// flag=true 生产 ,消费者等待,生产完毕后通知消费
// flag=false 消费, 生产着等待,消费完毕后通知生产
private boolean flag = true;
/**
* play 生产
*
* @param name
*/
public synchronized void play(String name) {
if (!flag) { // 生产者等待
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 生产
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("播放:" + name);
// 生产完毕
this.name = name;
// 通知消费 -->等待一个
notify();
// 停止生产
flag = false;
}
/**
* 消费
*/
public synchronized void sale() {
// 消费者等待
if (flag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 开始消费
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 消费者完毕
System.out.println("观看:" + name);
// 唤醒
this.notifyAll();
// 消费停止
flag = true;
}
}
播放线程:
class Player implements Runnable {
// 共同的资源
private Movie movie;
public Player(Movie movie) {
super();
this.movie = movie;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
movie.play("速度激情8");
} else {
movie.play("蓝精灵");
}
}
}
}
观看线程:
class Watch implements Runnable {
// 共享资源
private Movie movie;
public Watch(Movie movie) {
super();
this.movie = movie;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
movie.sale();
}
}
}