多线程生产者消费者问题, 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
请问第二行为什么会出现空值?
Dalam kod Filem, bendera dimulakan kepada palsu
Lihat set dan dapatkan kaedah dalam kelas Filem anda Anda mesti melaksanakan get sebelum anda boleh melaksanakan set.
Jadi saya rasa bendera pada permulaan kaedah get dan set dalam kelas Fail harus ditulis ke belakang!