notify,wait,synchronized实现线程间通知

wait阻塞线程释放锁;notify使wait所在的线程被唤醒在次获得锁,并执行,但要等到notify所在的线程代码全部执行后!

示例代码如下:

package com.vhbi.service.impl;

import com.sun.org.apache.xerces.internal.xs.datatypes.ObjectList;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by zzq on 2017/5/8.
 */
public class TeamTest {

    private LinkedList _list = new LinkedList<Object>();

    private int size = 0;

    private AtomicInteger atomicInteger = new AtomicInteger();

    public TeamTest(int size) {
        this.size = size;
    }

    private final Object lock = new Object();

    public void take() throws Exception {
        synchronized (lock) {
            while (0 == atomicInteger.get()) {//计数器和最大值相等
                lock.wait();//进入等待状态,释放锁
            }
            //被唤醒后
            //1.计数器减一
            atomicInteger.decrementAndGet();
            //2.队列去掉一个
            Object currObj = _list.removeFirst();
            System.out.println("------take------ " + currObj);
            //3.获得锁,唤醒wait执行线程的等待
            lock.notify();
        }
    }

    public void put(Object obj) throws Exception {
        synchronized (lock) {
            while (this.size == atomicInteger.get()) {//计数器和最大值相等
                lock.wait();//进入等待状态,释放锁
            }
            //被唤醒后
            //1.计数器加一
            atomicInteger.incrementAndGet();
            //2.队列添加一个
            _list.add(obj);
            System.out.println("------put------ " + obj);
            //3.获得锁,唤醒wait执行线程的等待
            lock.notify();
        }
    }
}

测试结果代码:

 @org.junit.Test
    public void main2() throws Exception {
        final TeamTest teamTest = new TeamTest(5);
        teamTest.put(1);
        teamTest.put(2);
        teamTest.put(3);
        teamTest.put(4);
        teamTest.put(5);

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    teamTest.put(6);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();

        Thread.sleep(5000);
        teamTest.take();

    }

    @org.junit.Test
    public void main3() throws Exception {
        final TeamTest teamTest = new TeamTest(5);

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    teamTest.take();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();

        Thread.sleep(5000);
        teamTest.put(1);
        teamTest.put(2);

    }
时间: 2024-11-05 12:31:21

notify,wait,synchronized实现线程间通知的相关文章

(8) wait、notify、notifyAll实现线程间通信

在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信.在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调用notify()方法或notifyAll()方法),在线程中调用notify()方法或notifyAll()方法,将通知其他线程从wait()方法处返回. Object是所有类的超类,它有5个方法组成了等待/通知机制的核心:notify().notifyAll().wait().wait(long

Java线程间通信之wait/notify

Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式.先来我们来看下相关定义: wait() :调用该方法的线程进入WATTING状态,只有等待另外线程的通知或中断才会返回,调用wait()方法后,会释放对象的锁. wait(long):超时等待最多long毫秒,如果没有通知就超时返回. notify() : 通知一个在对象上等待的线程,使其从wait()方法返回,而返回的前

java中关于线程间协作所用关键字synchronized,wait,notify的用法

wait/notify()关键字适用于一个线程通知另一个线程所需的条件状态已就绪,最常用于线程在循环中休眠直到获取特定条件的场景. 例如,一个线程一直等待直到队列中有一个组件能够处理:当组件添加到队列时,另一个线程能够唤醒这个等待的线程. 如下代码演示线程间的协作: package thread_waitnotify; public class ProductFactory { class Worker implements Runnable { private final Object loc

Java 多线程 :入门(2)- 线程间协作:挂起当前线程(wait)与通知其他线程继续执行(notify\ notifyAll)

首先,之前我理解起来比较混沌的是到底谁是‘锁’这个问题,因为线程间协作的核心就是锁的交换,通过每个线程的“获得锁”与“释放锁”来实现. 锁,也叫“互斥”,是一种机制,通过控制一个对象在一定代码段(或方法内)同时只能被一个线程所访问,来实现所谓的(对于这个特定对象的)“线程安全”. 1.先看一个从网上扒来的最基本款示例,原文 http://www.cnphp6.com/archives/62258,写的很棒很清晰,我这里略微改了一两句: public class TestNotifyByFlag

java并发编程(十一)线程间的通信notify通知的遗漏

notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块后,threadA再开始wait,便会一直阻塞等待,直到被别的线程打断. 实例见 :https://git.oschina.net/wenjieyatou/threadTest 在threadB进行通知之前,先将okToProceed置为true,这样如果threadA将通知遗漏,那么就不会进入wh

转:【Java并发编程】之十一:线程间通信中notify通知的遗漏(含代码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17228213 notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块后,threadA再开始wait,便会一直阻塞等待,直到被别的线程打断. 遗漏通知的代码 下面给出一段代码演示通知是如何遗漏的,如下: [java] view plain co

Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态.然后等待消费者消费了商品,然后消费者通知生产者队列有空间了.同样地,当

线程间协作:wait、notify、notifyAll

转载:http://blog.csdn.net/ns_code/article/details/17225469      在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信.在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调用notify()方法或notifyAll()方法),在线程中调用notify()方法或notifyAll()方法,将通知其他线程从wait()方法处返回. Object是所有

【Java并发编程】之十:使用wait/notify/notifyAll实现线程间通信的几点重要说明

在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信.在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调用notify()方法或notifyAll()方法),在线程中调用notify()方法或notifyAll()方法,将通知其他线程从wait()方法处返回. Object是所有类的超类,它有5个方法组成了等待/通知机制的核心:notify().notifyAll().wait().wait(long