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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© AndyYuan 中级黑马   /  2015-8-16 16:38  /  135 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class ProducerConsumer {

  2.         public static void main(String[] args) {
  3.                 Resouse account = new Resouse() ;
  4.                 Producer producer = new Producer(account) ;
  5.                 Consumer consumer = new Consumer(account);
  6.                
  7.                 Thread t1 = new Thread(producer);
  8.                 Thread t2 = new Thread(producer);
  9.                 Thread t3 = new Thread(consumer);
  10.                 Thread t4 = new Thread(consumer);
  11.                 t1.start();
  12.                 t2.start();
  13.                 t3.start();
  14.                 t4.start();

  15.         }
  16. }

  17. class Resouse {
  18.         int sum = 0 ;
  19.         Boolean flag = false;
  20.         synchronized void save(){
  21.                 if(flag){
  22.                         try {
  23.                                 wait();
  24.                         } catch (InterruptedException e) {
  25.                                 // TODO Auto-generated catch block
  26.                                 e.printStackTrace();
  27.                         }
  28.                 }else {
  29.                         notifyAll();
  30.                         flag = true ;
  31.                         sum++ ;
  32.                         System.out.println("producer"+sum);
  33.                 }
  34.         }
  35.        
  36.         synchronized void out(){
  37.                 if(!flag){
  38.                         try {
  39.                                 wait();
  40.                         } catch (InterruptedException e) {
  41.                                 // TODO Auto-generated catch block
  42.                                 e.printStackTrace();
  43.                         }
  44.                 }else {
  45.                         notifyAll();
  46.                         flag = false ;
  47.                         System.out.println("consumer<<<"+sum);
  48.                 }
  49.         }
  50. }

  51. class Producer implements Runnable{
  52.         Resouse account ;
  53.         public Producer(Resouse account ){
  54.                 this.account = account ;
  55.         }
  56.         public void run(){
  57.                 for(int i=0;i<100;i++){
  58.                         account.save();
  59.                 }
  60.         }
  61. }

  62. class Consumer implements Runnable{
  63.         Resouse account ;
  64.         public Consumer(Resouse account ){
  65.                 this.account = account ;
  66.         }
  67.         public void run(){
  68.                 for(int i=0;i<100;i++){
  69.                         account.out();
  70.                 }
  71.         }
  72. }
复制代码
大部分时候结果小于100,有时还大于100.

1 个回复

倒序浏览
没看懂,为啥要锁两个函数,用lock就好了吗。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马