生产者 和 消费者 --------------------------- 1/ 生产者: 2/ 消费者:
---------------------------- Object ===>>>> notify() 唤醒该线程 waitwait() 等待 -------------------------------- 消费者应等待生产者生产后消费.....--------------------------------
========================================================
练习Demo: 电影院录入电影 消费者消费电影 资源 ==> 电影类
要求: 电影生产两部电影后,消费者开始消费
============================================================
思路: 1/ 生产者和消费者 实现接口 Runable 重写run方法 做简单练习Demo
``` 2/ 资源是共享的 , 需要在资源类,即电影类中加入方法 生产电影 和消费电影的两个方法,同时为两个方法上锁
3/ 上锁后,还需借助父类的 wait() 和 notify() 两个方法来控制线程的工作状态..
============================================================
代码:
-------------------------------------------------------------
生产者:
public class ProductThread implements Runnable { private Movie movie = null; private boolean flag = false ; public ProductThread(Movie movie) { this.movie = movie; } @Override public void run() { //模拟录入电影 循环录入二十遍电影 两部电影交替录入 for ( int i = 0 ; i < 20 ; i++ ) { if (flag) { this.movie.setMovie("变形金刚","科幻电影"); flag = false; }else { this.movie.setMovie("僵尸先生","恐怖电影"); flag = true; } } } }
+++++++++++++++++++++++++++++++++++
消费者:
public class CastThread implements Runnable { private Movie movie = null; public CastThread(Movie movie) { this.movie = movie; } @Override public void run() { //循环显示20此购买信息 模拟消费 for (int i = 0 ; i < 20 ; i ++ ) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.movie.getMovie(); } } }
++++++++++++++++++++++++++++++++++++
电影类:
public class Movie { private String name; private String info; private boolean flag = true; // 标志位 控制生产 true 表示当前没有电影 需要生产 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } public synchronized void setMovie(String name, String info) { if (!flag) { System.out.println(flag); try { super.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.name = name; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.info = info; flag = false; //重置标志位,让消费者消费 super.notify(); } public synchronized void getMovie() { if (flag) { try { super.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(this.getName() + "-消费-" + this.getInfo()); flag = true; super.notify(); } }
+++++++++++++++++++++++++++++++++++++
测试类:
public class MovieTest { public static void main(String[] args) { Movie movie = new Movie(); Thread scz = new Thread(new ProductThread(movie)); Thread xfz = new Thread(new CastThread(movie)); scz.start(); xfz.start(); } }
生产者 和 消费者 --------------------------- 1/ 生产者: 2/ 消费者:
---------------------------- Object ===>>>> notify() 唤醒该线程 waitwait() 等待 -------------------------------- 消费者应等待生产者生产后消费.....--------------------------------
========================================================
练习Demo: 电影院录入电影 消费者消费电影 资源 ==> 电影类
要求: 电影生产两部电影后,消费者开始消费
============================================================
思路: 1/ 生产者和消费者 实现接口 Runable 重写run方法 做简单练习Demo
``` 2/ 资源是共享的 , 需要在资源类,即电影类中加入方法 生产电影 和消费电影的两个方法,同时为两个方法上锁
3/ 上锁后,还需借助父类的 wait() 和 notify() 两个方法来控制线程的工作状态..
============================================================