当前位置: 首页>后端>正文

线程通信:生产消费

线程通信:生产消费,第1张

/**

产者和消费者

关于Object类中的wait和notify方法。

第一:wait和notify方法不是线程对象的方法,是java中任何一个java对象

都有的方法,因为这两个方式是Object类中自带的。

wait方法和notify方法不是通过线程对象调用,

不是这样的:t.wait(),也不是这样的:t.notify()..不对。

第二:wait()方法作用:

?Object o = new Object();

?o.wait();

表示:

让正在o对象上活动的线程进入等待状态,无期限等待,

直到被唤醒为止。

o.wait();方法的调用,会让“当前线程(正在o对象上

活动的线程)”进入等待状态。

第三:notify()方法作用:

?Object o = new Object();

?o.notify();

表示:

唤醒正在o对象上等待的线程。

还有一个notifyAll()方法:

这个方法是唤醒o对象上处于等待的所有线程。

注意:wait方法和notify方法需要建立在synchronized线程同步的基础之上。

重点:o.wait()方法会让正在o对象上活动的当前线程进入等待状态,并且释放之前占有的o对象的锁;

o.notify()方法只会通知,不会释放之前占有的o对象的锁。

生产者和消费者模式

生产者与消费者模式是并发、多线程编程中经典的设计模式,通过wait和notifyAll方法实现。

例如:生产满了,就不能继续生产了,必须让消费线程进行消费。

消费完了,就不能继续消费了,必须让生产线程进行生产。

而消费和生产者共享的仓库,就为多线程共享的了,所以需要考虑仓库的线程安全问题。

wait方法和notify方法建立在线程同步的基础之上。因为多线程要同时操作一个仓库。有线程安全问题。

wait方法作用:o.wait()让正在o对象上活动的线程t进入等待状态,并且释放掉t线程之前占有的o对象的锁。

notify方法作用:o.notify()让正在o对象上等待的线程唤醒,只是通知,不会释放o对象上之前占有的锁。

?*/

public class MyWait2 {

????public static void main(String[] args) {

//创建1个仓库对象,共享的。

????????List list = new ArrayList();

//创建两个线程对象

//生产者线程

????????Thread t1 = new Thread(new Producer2(list));

//消费者线程

????????Thread t2 = new Thread(new Consumer2(list));

t1.setName("生产者线程");

t2.setName("消费者线程");

????????t1.start();

????????t2.start();

????}

}

//生产线程

class Producer2 implements Runnable {

//仓库

????private List list;

????public Producer2(List list) {

????????this.list = list;

????}

????@Override

????public void run() {

//一直生产(使用死循环来模拟一直生产)

????????while(true){

//给仓库对象list加锁。

????????????synchronized (list){

if(list.size() > 0){ //大于0,说明仓库中已经有1个元素了。

????????????????????try {

//当前线程进入等待状态,并且释放Producer之前占有的list集合的锁。

????????????????????????list.wait();

????????????????????} catch (InterruptedException e) {

????????????????????????e.printStackTrace();

????????????????????}

????????????????}

//程序能够执行到这里说明仓库是空的,可以生产

????????????????Object obj = new Object();

????????????????list.add(obj);

????????????????System.out.println(Thread.currentThread().getName() + "--->" + obj);

//唤醒消费者进行消费

????????????????list.notifyAll();

????????????}

????????}

????}

}

//消费线程

class Consumer2 implements Runnable {

//仓库

????private List list;

????public Consumer2(List list) {

????????this.list = list;

????}

????@Override

????public void run() {

//一直消费

????????while(true){

????????????synchronized (list) {

????????????????if(list.size() == 0){

????????????????????try {

//仓库已经空了。

//消费者线程等待,释放掉list集合的锁

????????????????????????list.wait();

????????????????????} catch (InterruptedException e) {

????????????????????????e.printStackTrace();

????????????????????}

????????????????}

//程序能够执行到此处说明仓库中有数据,进行消费。

????????????????Object obj = list.remove(0);

????????????????System.out.println(Thread.currentThread().getName() + "--->" + obj);

//唤醒生产者生产。

????????????????list.notifyAll();

????????????}

????????}

????}

}


https://www.xamrdz.com/backend/3bf1936252.html

相关文章: