A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王峰峰 中级黑马   /  2014-4-3 22:01  /  813 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

题目:生产者与消费者,生产者要求生产两种信息(1、王峰峰 – JAVA 学生   2wff – www.wff.com,生产与消费规定是:要求生产者交替生产这两种信息,生产者生一种等待消费者取走后再生产另一种信息,生产50次。
以下是要操作的信息类:
  1. public class Info {
  2.         private String name = "王峰峰" ;
  3.         private String content = "JAVA 学生" ;
  4.         private boolean flag = false ;        //定义标记位
  5.        
  6.         public synchronized void set(String name, String content) {        //设置信息
  7.                 if(!flag) {                //表示已经有值,不能在生产
  8.                         try {
  9.                                 super.wait() ;
  10.                         }catch(InterruptedException e){
  11.                                 e.printStackTrace() ;
  12.                         }
  13.                 }
  14.                 this.setName(name) ;
  15.                 try {
  16.                         Thread.sleep(300) ;
  17.                 }
  18.                 catch (Exception e){
  19.                         e.printStackTrace() ;
  20.                 }
  21.                 this.setContent(content) ;
  22.                 flag = false ;                //改变标记位,表示可以取值了
  23.                 super.notifyAll() ;
  24.         }
  25.        
  26.         public synchronized void get() {        //打印信息
  27.                 if(flag) {                //表示没有值,只能生产
  28.                         try {
  29.                                 super.wait() ;
  30.                         }
  31.                         catch(InterruptedException e){
  32.                                 e.printStackTrace() ;
  33.                         }
  34.                 }
  35.                 System.out.println(this.getName() + " --> " +
  36.                                 this.getContent()) ;
  37.                 flag = true ;
  38.                 super.notifyAll() ;
  39.         }
  40.         public void setName(String name) {
  41.                 this.name = name ;
  42.         }

  43.         public void setContent(String content) {
  44.                 this.content = content ;
  45.         }

  46.         public String getName() {
  47.                 return this.name ;
  48.         }

  49.         public String getContent() {
  50.                 return this.content ;
  51.         }
  52. }
复制代码

以下是生产者类:


  1. public class Producer implements Runnable {
  2.         private Info info = null ;        //用来保存Info的引用

  3.         public Producer(Info info) {
  4.                 this.info = info ;
  5.         }

  6.         public void run() {
  7.                 //定义标记位,如果为true生产一种信息,\
  8.                 //为false生产另一种信息
  9.                 boolean flag = false ;
  10.                 for(int i=0; i<50; i++) {
  11.                         if(flag) {
  12.                                 info.set("王峰峰","Java 学生") ;
  13.                                 flag = false ;
  14.                         }else {
  15.                                 info.set("wff","www.wff.com") ;
  16.                                 flag = true;
  17.                         }
  18.                 }
  19.         }
  20. }
复制代码

以下是消费者类:

  1. //消费者
  2. public class Consumer implements Runnable{
  3.         private Info info ;

  4.         public Consumer(Info info) {
  5.                 this.info = info ;
  6.         }

  7.         public void run() {
  8.                 for(int i=0; i<50; i++) {
  9.                         info.get() ;
  10.                 }
  11.         }
  12. }
复制代码
以下是测试类:

  1. public class ThreadTest {
  2.         public static void main(String[] args) {
  3.                 Info info = new Info() ;        //信息类
  4.                 Producer pro = new Producer(info) ;        //生产者
  5.                 Consumer con = new Consumer(info) ;        //消费者
  6.                 new Thread(pro).start() ;
  7.                 new Thread(con).start() ;
  8.         }
  9. }
复制代码


1 个回复

倒序浏览
嗯 不错啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马