多线程生产者消费者问题, producer生产电影(两种), customer 观看电影
Film.java
package Film;
public class Film {
private String name;
private String actor;
private boolean flag = false;
public synchronized void set(String name, String actor)
throws InterruptedException {
if(!flag){
this.wait();
}
this.setName(name);
Thread.sleep(1000);
this.setActor(actor);
flag = false;
this.notify();
}
public synchronized void get() throws InterruptedException{
if(flag){
this.wait();
}
Thread.sleep(1000);
System.out.println("3"+this.getName()+"-->"+this.getActor());
flag=true;
this.notify();
}
public void setName(String name) {
this.name = name;
}
public void setActor(String actor) {
this.actor = actor;
}
public String getName() {
return name;
}
public String getActor() {
return actor;
}
}
Producer.java
package Film;
public class Producer implements Runnable {
private Film film ;
public Producer(Film film) {
super();
this.film = film;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 1; i < 10; i++) {
if (0==i%2) {
try {
System.out.println("1-produce film " + i);
film.set("film1", "actor1");
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
System.out.println("1-produce film " + i);
film.set("film2", "actor2");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Customer.java
public class Customer implements Runnable {
private Film film ;
public Customer(Film film){
this.film=film;
}
public void run() {
for(int x=1;x<10;x++){
try {
Thread.sleep(1000);
film.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
MainTest.java
package Film;
public class MainTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Film film = new Film();
Producer pro = new Producer(film);
Customer cus = new Customer(film);
new Thread(pro).start();
new Thread(cus).start();
}
}
输出如下
1-produce film 1
3null-->null
1-produce film 2
3film2-->actor2
1-produce film 3
3film1-->actor1
1-produce film 4
3film2-->actor2
1-produce film 5
3film1-->actor1
1-produce film 6
3film2-->actor2
1-produce film 7
3film1-->actor1
1-produce film 8
3film2-->actor2
1-produce film 9
3film1-->actor1
请问第二行为什么会出现空值?
在 Film 這個程式碼裡面,flag初始化為false,
看你的 Film class 中的set, get 方法,必須先執行過 get 之後 才能執行 set。
所以我覺得 File class 中 的get,set方法開頭的flag判斷應該是寫反了吧!
雷雷