线程同步notify,notifyall,wait探究

本文详细介绍了生产者与消费者模型的实现过程,包括生产者类和消费者类的实现,以及测试程序的使用,强调了wait、notify、wait时间值的概念及线程同步的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生产者与消费者模型的实现

生产者

package apla;

import java.util.Queue;
import java.util.Random;

public class Productor implements Runnable {
// 最大库容
private int maxNum = 10;
// 需要同步的锁
Queue<String> queue;

public Productor(Queue<String> queue ) {
    this.queue = queue;
}

@Override
public void run() {
    // TODO Auto-generated method stub
    while(true){
        synchronized(queue){
            while(queue.size()==maxNum){
                System.out.println("queue is full, stop product,consume come on");
                try {
                    queue.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            Random r = new Random();
            String c = r.nextInt(100)+"";
            System.out.println("Product "+c);
            queue.notify();
            try {
                Thread.sleep(100);//不释放锁,放缓节奏
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

}

消费者

package apla;

import java.util.Queue;

public class Consumer1 implements Runnable {
// 需要同步的锁
Queue<String> queue;

public Consumer1(Queue<String> queue) {
    this.queue = queue;
}

@Override
public void run() {
    // TODO Auto-generated method stub
    while(true){
        synchronized(queue){
            while(queue.size()==0){
                System.out.println("queue is null, stop consume,product come on");
                try {
                    queue.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            String p = queue.remove();
            System.out.println("Consume  "+p);
            queue.notify();
            try {
                Thread.sleep(1000);//不释放锁,放缓节奏
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

}

测试程序

package apla;

import java.util.LinkedList;
import java.util.Queue;

public class Copy {
    public static void main(String[] args) {
        // 仓库
        Queue<String> queue = new LinkedList<String>();
        Thread t1 = new Thread(new Consumer1(queue));
        Thread t2 = new Thread(new Productor(queue));
        t1.start();
        t2.start();
    }
}

需要注意的地方

1 wait需要放在一个不断循环的语句中,确保能够被唤醒,执行后边的内容。
2 notify和notifiyall的区别。在两个线程的情况下,二者相同。多个线程的时候,notify不确定唤起那个线程,notifyall唤起所有的线程。
3 wait可以传入时间值,达到自我唤醒的目的。如果设置了时间值,在时间值未达到时被唤醒也会继续执行。

1/18/2016 3:36:08 PM

参考内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值