码迷,mamicode.com
首页 > 编程语言 > 详细

同步线程,生产消费案例。

时间:2017-03-15 00:26:06      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:i++   通信   线程通信   code   释放   ring   name   null   资源   

public class ShareResourse {
    private String name ;
    private String gender;
    private boolean isEmpty=true;//表示为数据为空
    /**
     * 生产者向共享资源中存储数据
     * name   存贮的姓名
     * gender 存储的性别
     */
    
     synchronized public void push (String name,String gender){
         try {
             while(!isEmpty){//当前为false ,存储不为空,等待消费者消费,
             //使用同步锁对象来调用, 表示当前线程释放同步锁,只能被其他线程所唤醒
                 this.wait();
             } 
             //~~~~~~开始消费~~~~~~~·
            this.name = name;
            Thread.sleep(10);
            this.gender= gender;
            //~~~~~~开始消费~~~~~~~~
            isEmpty= false;//不为空需要一个消费消费
            this.notify();//唤醒一个消费者
         }catch (Exception e) {
            e.printStackTrace();
         }
     }
    
    /**
     * 消费者从共享资源中取出数据
     */
     synchronized public void popup(){
         try {
             while(isEmpty){//当前为true ,存储为空,等待生产者生产,
             //使用同步锁对象来调用, 表示当前线程释放同步锁,只能被其他线程所唤醒
                this.wait();
                }
                //~~~~~~~~开始生产~~~~~~~~~~~~~
                Thread.sleep(10);
                System.out.println(this.name +"——"+this.gender);
                //~~~~~~~~结束生产~~~~~~~
                isEmpty = true;//为空,需要生产
                this.notify();//唤醒一个生产者
             }catch (Exception e) {
                e.printStackTrace();
             }
     }
}

//生产者

//生产者
public class Product implements  Runnable {
    //共享资源对象
    private ShareResourse resourse = null;
    
    public Product(ShareResourse resourse){
        this.resourse = resourse;
    }
    public void run() {
        for (int i = 0; i < 500; i++) {
            if(i%2==0)
                resourse.push("春哥~", "男");
            else
                resourse.push("凤姐", "女");
        }
    }
}

//消费者

package 线程通信;

public class consumer implements Runnable {

    private ShareResourse resourse= null;

    public consumer(ShareResourse resourse) {//使用构造器传递resourse
        this.resourse= resourse;
    }

    @Override
    public void run() {
        for (int i = 0; i < 500; i++) {
            resourse.popup();
        }

    }

}

//测试类

package 线程通信;

public class App {
    public static void main(String[] args) {
        ShareResourse resourse = new ShareResourse();
        new Thread(new Product(resourse)).start();//有参构造器Proudct
        new Thread(new consumer(resourse)).start();//有参构造器consumer
    }
}

 

同步线程,生产消费案例。

标签:i++   通信   线程通信   code   释放   ring   name   null   资源   

原文地址:http://www.cnblogs.com/ITxiaocai/p/6551409.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!