相关概念

  • 锁:解决线程间冲突的问题

  • wait&notify:解决线程间协作的问题

  • wait和sleep的区别

    wait期间对象锁是释放的,而sleep只能延时,并未释放锁

  • 调用wait方法:暂停正在执行的线程,放弃CPU执行权,并释放资源锁

  • 调用notify方法:唤醒暂停的线程使之运行

生产者&消费者模型

场景逻辑:定义两个类,分别为商店和顾客。顾客随机点可乐,鸡翅等食物,商店生产对应的食物,然后顾客食用食物

核心:定义一个全局对象实现多线程情况下线程间的可见,以实现线程协作

package com.noneplus;

public class Main {

    private final Object flag = new Object();

    private static String[] food = {"可乐", "鸡翅", "鸡腿", "披萨"};

    private static String foodType;

    public static void main(String[] args) {

        Main main = new Main();

        Thread store = main.new Store();

        Thread customer1 = main.new Customer();

        store.start();

        customer1.start();

    }

    class Store extends Thread {

        @Override
public void run() {
while (true) { synchronized (flag) {
flag.notify();
if (Main.foodType==null)
{
System.out.println("暂无订单");
}
else
{
System.out.println("生产:" + Main.foodType);
try {
flag.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
} class Customer extends Thread { @Override
public void run() { while (true) {
synchronized (flag) {
flag.notify();
Main.foodType = Main.food[(int) (Math.random() * 3)]; System.out.println("订购:" + Main.foodType); try {
flag.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("食用: " + Main.foodType);
System.out.println("===============");
}
}
}
}
}
订购:可乐
生产:可乐
食用: 可乐
===============
订购:鸡腿
生产:鸡腿
食用: 鸡腿
===============
订购:鸡翅
生产:鸡翅
食用: 鸡翅

参考:Java 多线程编程之:notify 和 wait 用法

线程通讯wait&notify的更多相关文章

  1. 线程同步(使用了synchronized)和线程通讯(使用了wait,notify)

    线程同步 什么是线程同步? 当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题. 实现同步机制有两个方法:1.同 ...

  2. java多线程(2)---生命周期、线程通讯

    java生命周期.线程通讯 一.生命周期 有关线程生命周期就要看下面这张图,围绕这张图讲解它的方法的含义,和不同方法间的区别.    1.yield()方法 yield()让当前正在运行的线程回到就绪 ...

  3. java多线程(五)线程通讯

    1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...

  4. Java线程通讯方法之wait()、nofity() 详解

    Java线程通讯方法之wait().nofity() 详解 本文将探讨以下问题: synchronized 代码块使用 notify()与notifyAll()的区别 Java wait(),noti ...

  5. Android 线程通讯类Handler

    handler是线程通讯工具类.用于传递消息.它有两个队列: 1.消息队列 2.线程队列 消息队列使用sendMessage和HandleMessage的组合来发送和处理消息. 线程队列类似一段代码, ...

  6. Android——线程通讯 Handler、Looper、Message;

    线程通讯问题 (主要用到了Handler类,Looper类和Message类以及MessageQueue) 在Android中主线程如何向子线程中发送消息的问题.让我们来想想,这其中的过程,无非就是创 ...

  7. Android——线程通讯类Handler(转)

    原文地址:http://uule.iteye.com/blog/1705951 handler是线程通讯工具类.用于传递消息.它有两个队列:1.消息队列2.线程队列 消息队列使用sendMessage ...

  8. 线程中wait/notify/notifyAll的用法

    前言 多线程时,最关注的就是线程同步,线程间的同步一般用锁来实现,常见的锁就是synchronized和lock.用了synchronized,就不得不提到wait/notify/notifyAll. ...

  9. Java并发之(2):线程通信wait/notify(TIJ_21_5)

    简介: java中线程间同步的最基本的方式就是使用wait()&notify()&notifyAll(),它们是线程间的握手机制.除了上述方法,java5还在java.util.con ...

随机推荐

  1. css换行后缩进,css缩进技巧

    一般情况下像下图这样需要缩进的,一般都会外面一个div里面两块需要两个div然后用定位或者flex.table.浮动后设置宽度等来实现 已知宽度的情况下上面列的方法都适用 不知宽度的情况下可以用fle ...

  2. DelayQueue源码分析

    DelayQueue<E>继承于AbstractQueue<E>实现BlockingQueue<E> 内部变量包括ReentrantLock 类型的lock以及条件 ...

  3. DEX文件解析--7、类及其类数据解析(完结篇)

    一.前言    前置技能链接:       DEX文件解析---1.dex文件头解析       DEX文件解析---2.Dex文件checksum(校验和)解析       DEX文件解析--3.d ...

  4. Nginx/Httpd反代tomcat配置

    在上一篇博客中,我们了解了tomcat的server.xml中各组件的用法和作用:其中对于tomcat连接器来说,它分三类,一类是http连接器,一类是https连接器,一类是ajp连接器:通常tom ...

  5. css初始化表(normalize.css)

    为什么要初始化CSS? 建站老手都知道,这是为了考虑到浏览器的兼容问题,其实不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面差异.当然,初始化样式会对SEO有一定的 ...

  6. Java-旋转字符串

    描述 旋转字符串 给定一个字符串(以字符数组的形式给出)和一个偏移量,根据偏移量原地旋转字符串(从左向右旋转). 挑战 在数组上原地旋转,使用O(1)的额外空间 说明 原地旋转意味着你要在s本身进行修 ...

  7. 【Django组件】WebSocket的简单实现

    1:HTML: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF ...

  8. 一个简单的Android小实例分享,包含recycleView与recyclerView嵌套

    先上图: 1.首页 2.第二页 3.第三页 项目目录: 代码不多,本人太懒,就不贴了 项目地址:

  9. Sqlite3 实现学生信息增删改查

    import sqlite3 conn = sqlite3.connect('studentsdb.db') # 连接数据库 cursor = conn.cursor( ) # 创建数据表 def c ...

  10. KNN算法基本原理与sklearn实现

    ''' KNN 近邻算法,有监督学习算法 用于分类和回归 思路: 1.在样本空间中查找 k 个最相似或者距离最近的样本 2.根据这 k 个最相似的样本对未知样本进行分类 步骤: 1.对数据进行预处理 ...