线程通信:等待、唤醒

Object方法 这些方法在拥有资源时才能调用
notify 唤醒某个线程。唤醒后不是立马执行,而是等CPU分配
wait 等待,释放锁,不占用CPU资源
notifyAll 唤醒全部等待的线程

重点:资源的有效利用

生产一个,消费一个;再生产一个,再消费一个

以热干面为例(生产者消费者问题):

class 热干面 {
int isOK = 0;
}
class 生产者 implements Runnable {
热干面 m;
public 生产者(热干面 m) {
this.m = m;
}
public void 做面() {
try {
synchronized (m) {
if (m.isOK > Desk.BUFFER_MAX) {
System.out.println("+等需要做了再做");
m.wait();
System.out.println("+开始做");
}
m.isOK++;
System.out.println("+做面" + m.isOK);
m.notify();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
while (true) {
try {
Thread.sleep(Desk.做面时间);
} catch (InterruptedException e) {
e.printStackTrace();
}
做面(); // 生产面
}
}
}
class 消费者 implements Runnable {
热干面 m;
public 消费者(热干面 m) {
this.m = m;
}
public void 吃面() {
try {
synchronized (m) {// # 锁住面对象
if (m.isOK <= 0) {
System.out.println("------等面");
m.wait();// 等待,释放锁
System.out.println("------有面了");
}
System.out.println("------吃面:" + m.isOK);
m.isOK--;
m.notify();// 唤醒另一个线程,但是,俩线程等CPU执行权
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
while (true) {
try {
Thread.sleep(Desk.吃面时间);
} catch (InterruptedException e) {
e.printStackTrace();
}
吃面();
}
}
}
class Desk {// 为了管理对象、模拟现实场景,可以不要
public static final int 做面时间 = 100;
public static final int 吃面时间 = 100;
public static final int BUFFER_MAX = 1;
热干面 msg = new 热干面();
生产者 m = new 生产者(msg);
消费者 c = new 消费者(msg);
Thread t1 = new Thread(m); // 生产者线程
Thread t2 = new Thread(c); // 消费者线程
public void fn() {
t1.start();
t2.start();
}
}
public class 生产者消费者问题 {
public static void main(String[] args) {
Desk d = new Desk();
d.fn();
}
}

Java基础教程——线程通信的更多相关文章

  1. Java基础教程——线程局部变量

    线程局部变量 ThreadLocal,线程局部变量,不提供锁,不做线程共享,而是为每个线程提供变量的独立副本. import java.util.concurrent.*; public class ...

  2. Java基础教程——线程同步

    线程同步 synchronized:同步的 例:取钱 不做线程同步的场合,假设骗子和户主同时取钱,可能出现这种情况: [骗子]取款2000:账户余额1000 [户主]取款2000:账户余额1000 结 ...

  3. Java基础教程——线程池

    启动新线程,需要和操作系统进行交互,成本比较高. 使用线程池可以提高性能-- 线程池会提前创建大量的空闲线程,随时待命执行线程任务.在执行完了一个任务之后,线程会回到空闲状态,等待执行下一个任务.(这 ...

  4. Java基础教程——线程状态

    线程状态 JAVA定义了6种线程状态: Thread.State public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, ...

  5. Java基础教程:多线程基础(2)——线程间的通信

    Java基础教程:多线程基础(2)——线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 ...

  6. Java基础教程:多线程基础——线程池

    Java基础教程:多线程基础——线程池 线程池 在正常负载的情况瞎,通过为每一个请求创建一个新的线程来提供服务,从而实现更高的响应性. new Thread(runnable).start() 在生产 ...

  7. Java基础教程:多线程基础(5)——倒计时器(CountDownLatch)

    Java基础教程:多线程基础(5)——倒计时器(CountDownLatch) 引入倒计时器 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种 ...

  8. Java基础教程:网络编程

    Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...

  9. Java基础教程:Lambda表达式

    Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...

随机推荐

  1. 什么是SOAP?SOAP有什么用?什么时候会用到SOAP?

    什么是SOAP SOAP(Simple Object Access Protocol)一般指简单对象访问协议,简单对象访问协议是交换数据的一种协议规范,是一种轻量的.简单的.基于XML(标准通用标记语 ...

  2. Luogu P3262 [JLOI2015]战争调度

    题意 给定一棵高度为 \(n\) 的完全二叉树,可以将节点设置成两种状态.如果某个叶子 \(x\) 的状态为 \(i\) 同时他的某个祖先也为 \(i\),那么这个叶子就会对祖先产生 \(f_{x,i ...

  3. STM32入门系列-复位程序

    已经对启动文有了大致了解,再来看看系统在复位过程中做了哪些工作.复位程序如下: 1 ; Reset handler 2 3 Reset_Handler PROC 4 5 EXPORT Reset_Ha ...

  4. DM存储过程示例子-表的行数对比

    1.DM存储过程示例子,表的行数对比 1 --1. ================全量 2 --select * from DM_VERI where c2 != c3; 3 --drop tabl ...

  5. ElasticSearch初步了解和安装(windows上安装)

    ElasticSearch是什么 ElasticSearch(一般简称es)是一个基于Lucene的分布式搜索和数据分析引擎.它提供了REST api 的操作接口.它可以快速的存储.搜索.分析海量数据 ...

  6. How to using code find the menu label of Menus【X++】

    // VAR Changed by Xie Yu Fan.Fandy 谢宇帆 static void XIE_FindMenu(Args _args) { Dialog dlg = new Dialo ...

  7. python爬虫07BeautifulSoup

    有一个高效的网页解析库 它的名字叫做 BeautifulSoup 它   是一个可以从 HTML 或 XML 文件中提取数据的 Python 库 首先我们要安装一下这个库 pip install be ...

  8. Linux系统中使用confluence构建企业wiki

    搭建confluence服务需要的步骤有:一,安装java环境即安装jdk8.二,安装需要使用的数据库(建议使用mysql5.6).三,破解的confluence6服务. 一,所需软件下载 1,下载j ...

  9. CCPC 2020 长春站 部分简略题解

    gym链接:CCPC 2020 changchun site A: 题目大意:商店里有若干个充值档位和首充奖励,你有\(n\)块钱问最多能拿到多少水. 解:由于档位不多可以直接枚举,整个二进制枚举一下 ...

  10. npm的命令参数 --save-dev和 --save两者有什么区别?

    我们在安装npm包的时候经常会遇到 --save-dev 和 --save 这两个命令参数,两个命令都是往package.json文件里写入信息,两者有什么区别呢? 1. --save 会把依赖包名称 ...