生产者与消费者模型

先介绍几个函数:

  • setPriority( ): 设置线程的优先权。

  • yield( ): 暂停线程的执行,给其它具有相同优先权的线程执行的机会,若此时没有其它线程执行,则此线程继续执行。这个函数并不会释放锁住的对象。

  • join( ): 等待加入的线程执行完毕才会执行下一个线程。加入的线程通过interrupt( )来唤醒。

  • wait( ): 类似sleep( ), 不同的是,wait( )会先释放锁住的对象,然后再执行等待的动作。注意,这个函数属于Object类。另外,由于wait( )所等待的对象必须先锁住,因此,它只能用在同步化程序段或者同步化方法内,否则,会抛出异常IllegalMonitorStateException

  • notify():恢复相同对象中第一个调用wait()的线程。


生产消费者模型:二者共享数据value,这里,生产者是Producter, 消费者是Consumer。生产者负责放物品到value中,消费者使用wait( )等待生产者的通知。当得到通知后,消费者取出物品,并且用notify( )通知生产者,可以再放下一批物品。


代码实例:

package cn.edu.pzhu;

class Q {
    int value;
    boolean tag = false; //标志生产消费的状态

    public synchronized int get() {
        if (!tag) {
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        System.out.println("Got: " + value);
        tag = false;
        notify();
        return value;
    }

    public synchronized void put(int val) {
        if (tag) {
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println("Put: " + val);
        value = val;
        tag = true;
        notify();
    }
}

class Producer implements Runnable {
    Q q;
    public Producer(Q q) {
        this.q = q;
        new Thread(this).start();
    }

    @Override
    public void run() {
        int i = 1;
        while(i < 5) {
            q.put(i++);
        }

    }
}

class Consumer implements Runnable {
    Q q;

    public Consumer(Q q) {
        this.q = q;
        new Thread(this).start();
    }

    @Override
    public void run() {
        int i = 1;
        while(i < 5) {
            q.get();
        }
    }

}

public class PCDemo {
    public static void main(String[] args) {
        Q q = new Q();
        @SuppressWarnings("unused")
        Producer producer = new Producer(q);
        @SuppressWarnings("unused")
        Consumer consumer = new Consumer(q);
    }
}

测试结果

Put: 1
Got: 1
Put: 2
Got: 2
Put: 3
Got: 3
Put: 4
Got: 4

如有不当之处欢迎指出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值