Java 多執行緒的生產與銷售應用
阿新 • • 發佈:2019-01-14
生產與消費多執行緒程式, 編寫電影院生產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();
}
}
}