并发编程大师系列之:wait/notify/notifyAll/condition

先把例子写出来,有空再补充。。。

/**
 * @author itachi
 * @Title: Express
 * @Description: 快递类
 * @date 2018/7/4下午10:27
 */
public class Express {

    // 始发地
    private final static String CITY = "ShangHai";

    // 里程变化
    private int km;

    // 地点变化
    private String site;

    Express() {

    }

    Express(int km, String site) {
        this.km = km;
        this.site = site;
    }

    // 里程数变化,会唤起线程
    public synchronized void changeKm() {
        this.km = 101;
        notify();
    }

    // 地点变化会唤起线程
    public synchronized void changeSite() {
        this.site = "BeiJing";
        notify();
    }

    // 用来监听里程数的变化
    public synchronized void waitKm() {
        while (this.km <= 100) {
            try {
                wait();
                System.out.println(Thread.currentThread().getId() + "-号监听===里程变化===的线程被唤醒了。。。");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getId() + "-号监听===里程变化===的线程去做相应的事了");
    }

    // 用来监听地点的变化
    public synchronized void waitSite() {
        while (CITY.equals(this.site)) {
            try {
                wait();
                System.out.println(Thread.currentThread().getId() + "-号监听===地点变化===的线程被唤醒了。。。");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getId() + "-号监听===地点变化===的线程去做相应的事了");
    }

}
/**
 * @author itachi
 * @Title: Test
 * @Description: 测试
 * @date 2018/7/4下午10:40
 */
public class Test {

    // 初始化快递
    private static Express express = new Express(0, "ShangHai");

    // 用来监听里程数变化的线程
    static class CheckKm implements Runnable {
        @Override
        public void run() {
            express.waitKm();
        }
    }

    // 用来监听地点变化的线程
    static class CheckSite implements Runnable {
        @Override
        public void run() {
            express.waitSite();
        }
    }

    public static void main(String[] args) throws InterruptedException{
        // 启动三个线程去监听里程数的变化
        for (int i = 0; i <= 2; i++) {
            new Thread(new CheckKm()).start();
        }

        // 启动三个线程去监听地点的变化
        for (int i = 0; i <= 2; i++) {
            new Thread(new CheckSite()).start();
        }

        // 主线程睡眠一秒,异常信息抛出去
        Thread.sleep(1000);

        // 让快递的地点发生变化
        express.changeSite();
    }

}
9-号监听===里程变化===的线程被唤醒了。。。
14-号监听===地点变化===的线程被唤醒了。。。
14-号监听===地点变化===的线程去做相应的事了
13-号监听===地点变化===的线程被唤醒了。。。
13-号监听===地点变化===的线程去做相应的事了
12-号监听===地点变化===的线程被唤醒了。。。
12-号监听===地点变化===的线程去做相应的事了
11-号监听===里程变化===的线程被唤醒了。。。
10-号监听===里程变化===的线程被唤醒了。。。
9-号监听===里程变化===的线程被唤醒了。。。

原文地址:https://www.cnblogs.com/zhangjianbing/p/9265910.html

时间: 2024-07-30 07:34:06

并发编程大师系列之:wait/notify/notifyAll/condition的相关文章

并发编程大师系列之:Synchronized的类锁和对象锁

说到并发编程,感觉跟大多数人一样,谈之色变,说它简单把,其实很有内容,说难吧,用起来也挺容易,最近我硬着头皮,决心要把并发编程好好的搞一遍.以前,面试的时候,面试官问,并发编程会吗?嗯,接触过,就加一个synchronized关键字就好了,面试官微笑着说,嗯好.特喵的现在感觉来说,这俩low逼.本来写了几行的软文,但感觉在技术文章里面体现,有失风度,明明可以靠文采吃饭,而我却非要靠技术,任性!上代码! 1.对象锁概念: java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放.线程进入s

并发编程大师系列之:线程的定义和中断 interrupt

1.启动线程的三种方式: 1.1继承Thread类 public static class UseThread extends Thread { public void run() { System.out.println("thread run 执行!"); } } 启动线程: UseThread ut = new UseThread(); ut.start(); 1.2实现Runable接口 public static class UseRun implements Runnabl

并发编程大师系列之:你真的了解ThreadLocal吗?

总记得在面试的时候被问到过,今天终于轮到你了ThreadLocal,从表面上读英文的意思为线程本地变量,这样也许更好理解了,就是每个线程自己独有的,不与其它线程共享的变量呗. 首先翻开源码,这个author的名字真的熟悉,对,就是dog李(Doug Lea),貌似lang包下的很多都是由这位哥编写的,看一下这个类中的结构(JDK1.8) 常用的就这几个,俩内部类,四个方法. 1. get()方法是用来获取ThreadLocal在当前线程中保存的变量副本. 2. set()用来设置当前线程中变量的

JAVA 并发编程-线程同步通信技术(Lock和Condition)(十)

在之前的博客中已经介绍过线程同步通信技术<JAVA 并发编程-传统线程同步通信技术(四)>,上篇是使用的synchronized,wait,notify来实现,今天我们使用的是Lock和Condition,下面我们结合两者对比来学习. 简单的Lock锁应用: /** * 简单Lock的应用 * @author hejingyuan * */ public class LockTest { public static void main(String[] args) { new LockTest

并发编程基础之wait以及notify的用法

一:概念 线程通信中经常用到wait和notify,顾名思义,wait即让当前线程处于等待状态,notify通知锁对象 上的另一个线程被唤醒,这里的唤醒是指可以去争夺锁资源,nofityAll是唤醒该对象上面所有处于 wait状态的线程 二:示例 线程t2一运行就处于wait等待状态,然后线程t1运行notify,唤醒线程t2 /** * */ package com.day2; /** * @author Administrator * */ public class NotifyWaitTh

【Java并发编程实战】—–“J.U.C”:Condition

在看Condition之前,我们先来看下面这个例子: 工厂类,用来存放.取出商品: public class Depot { private int depotSize; //仓库大小 private Lock lock; //独占锁 public Depot(){ depotSize = 0; lock = new ReentrantLock(); } /** * 商品入库 * @param value */ public void put(int value){ try { lock.loc

Java并发编程(五)ConcurrentHashMap的实现原理和源码分析

相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 前言 在Java1.5中,并发编程大师Doug Lea给我们带来了concurrent包,而该包中提供的ConcurrentHashMap是线程安全并且高效的HashMap,本节我们就来研究下ConcurrentHashMap是如何保证线程安全的同时又能高效的操作. 1.为何用ConcurrentHashMap 在并发编程中使用Has

【java并发编程艺术学习】(三)第二章 java并发机制的底层实现原理 学习记录(一) volatile

章节介绍 这一章节主要学习java并发机制的底层实现原理.主要学习volatile.synchronized和原子操作的实现原理.Java中的大部分容器和框架都依赖于此. Java代码 ==经过编译==>Java字节码 ==通过类加载器==>JVM(jvm执行字节码)==转化为汇编指令==>CPU上执行. Java中使用的并发机制依赖于JVM的实现和CPU的指令. volatile初探 volatile是是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性.可见性

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

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