Java回炉之多线程(二)生产者与消费者

Java回炉之多线程(二)生产者与消费者

[toc]
首先有一个资源类Resource,然后是生产者Producer和消费者Consumer,最后再来个用来演示的调用者Demo

  • Resource.java
public class Resource {

    //资源
    private String someThing="";
    //是否有资源
    private boolean hasResource=false;

    //放入资源(同步方法)
    public synchronized void putThing(String someThing){
        //如果有资源,则通知线程等待
        if(hasResource){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //如果没有资源则放入资源并通知线程资源已修改
        this.someThing=someThing;
        System.out.println("put resource:"+this.someThing);
        hasResource=true;
        this.notify();
    }

    //取出资源(同步方法)
    public synchronized String getThing(){
        //如果没有资源,则通知线程等待
        if(!hasResource){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //如果有资源则取出资源并通知线程资源已修改
        hasResource=false;
        this.notify();
        System.out.println("get resource:"+this.someThing);
        return someThing;
    }

}
  • Producer.java
public class Producer implements Runnable{

    //所生产的资源输出到resource
    private Resource resource;

    public Producer(Resource resource){
        this.resource=resource;
    }

    @Override
    public void run() {
        //不间断生产资源
        while(true){
            //使用随机数表示资源
            int num=new Random().nextInt();
            resource.putThing("number:"+num);
        }

    }

}
  • Consumer.java
public class Consumer implements Runnable{

    //所需要测资源从resource获取
    private Resource resource;

    public Consumer(Resource resource){
        this.resource=resource;
    }

    @Override
    public void run() {
        //不间断消费资源
        while(true){
            resource.getThing();
        }
    }



}
  • Main.java
public class Main {

    public static void main(String[] args) {
        //创建资源存放点
        Resource resource =new Resource();

        //创建生产者消费者
        Producer producer=new Producer(resource);
        Consumer consumer=new Consumer(resource);

        //分别为生产者和消费者创建线程
        Thread producerThread=new Thread(producer);
        Thread consumerThread=new Thread(consumer);

        //启动两个线程
        producerThread.start();
        consumerThread.start();
    }

}
  • 输出显示(截取部分)
put resource:number:-812816298
get resource:number:-812816298
put resource:number:574283090
get resource:number:574283090
put resource:number:748067081
get resource:number:748067081
put resource:number:1548622499
get resource:number:1548622499
put resource:number:-396459528
get resource:number:-396459528
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值