Java基础教程——线程通信
线程通信:等待、唤醒
| 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基础教程——线程通信的更多相关文章
- Java基础教程——线程局部变量
线程局部变量 ThreadLocal,线程局部变量,不提供锁,不做线程共享,而是为每个线程提供变量的独立副本. import java.util.concurrent.*; public class ...
- Java基础教程——线程同步
线程同步 synchronized:同步的 例:取钱 不做线程同步的场合,假设骗子和户主同时取钱,可能出现这种情况: [骗子]取款2000:账户余额1000 [户主]取款2000:账户余额1000 结 ...
- Java基础教程——线程池
启动新线程,需要和操作系统进行交互,成本比较高. 使用线程池可以提高性能-- 线程池会提前创建大量的空闲线程,随时待命执行线程任务.在执行完了一个任务之后,线程会回到空闲状态,等待执行下一个任务.(这 ...
- Java基础教程——线程状态
线程状态 JAVA定义了6种线程状态: Thread.State public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, ...
- Java基础教程:多线程基础(2)——线程间的通信
Java基础教程:多线程基础(2)——线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 ...
- Java基础教程:多线程基础——线程池
Java基础教程:多线程基础——线程池 线程池 在正常负载的情况瞎,通过为每一个请求创建一个新的线程来提供服务,从而实现更高的响应性. new Thread(runnable).start() 在生产 ...
- Java基础教程:多线程基础(5)——倒计时器(CountDownLatch)
Java基础教程:多线程基础(5)——倒计时器(CountDownLatch) 引入倒计时器 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种 ...
- Java基础教程:网络编程
Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...
- Java基础教程:Lambda表达式
Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...
随机推荐
- MongoDB Java连接---MongoDB基础用法(四)
MongoDB 连接 标准 URI 连接语法: mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN ...
- Educational Codeforces Round 95 (Rated for Div. 2)
CF的Educational Round (Div.2),质量还是蛮高的. A: 水题 #include<cstdio> #include<algorithm> typedef ...
- JQuery如何实现统计图表
EEP JQuery如何实现统计图表 讯光科技 前言 在ERP项目开发过程中,统计图表(chart)普遍应用于各种统计和报表中,其形象直观,内容清晰.EEP的JQuery网站项目使用了Easyui 插 ...
- Ubuntu18.04上安装NS-3
目录 第一步:处理gcc/g++版本 第二步:安装相关依赖 第三步:正式安装 第四步:测试 我自己前后安装过好几次NS3了,网上其他相关的博客质量都不是很好,因此自己总结了一个ns3的安装过程. 首先 ...
- 想学 iOS 开发高阶一点的东西,从何开始?
前言 如果你正在学习 iOS, 或者正在从事IOS开发? 还是一个一个迷茫的待就业大学生,或是公司的到一个半老员工? 现在到了开发的一个阶段了,基本的东西很熟了,想着提高技术? 学习难一点的东西,不知 ...
- C# 中的 ref 已经被放开,或许你已经不认识了
一:背景 1. 讲故事 最近在翻 netcore 源码看,发现框架中有不少的代码都被 ref 给修饰了,我去,这还是我认识的 ref 吗?就拿 Span 来说,代码如下: public readonl ...
- python数据分析03Python的数据结构、函数和文件
我们会从Python最基础的数据结构开始:元组.列表.字典和集合.然后会讨论创建你自己的.可重复使用的Python函数.最后,会学习Python的文件对象,以及如何与本地硬盘交互. 3.1 数据结构和 ...
- 1 Prism概述
架构目标 以模块化方式开发应用,这些模块被独立团队用WPF技术开发,集成,部署,这是使用Prism的最大好处. 最小化交叉团队依赖.允许团队在不同领域专业化,比如UI设计,商业逻辑实现,基础代码开发 ...
- 白话科普系列——双十一,竟然是一场有“预谋”的DDoS攻击?
随著互联网与信息技术的发展,所有人都在享受互联网带来的舒适和便利.如今,无论是个人社交行为,还是商业活动都早已离不开互联网. 但是,网络空间在创造机遇的同时,也带来了威胁.随着企业价值.知名度的提高. ...
- C语言中宏的作用
在C语言#define机制中包括了一个规定,与允许把参数替换到文本中,这种实现通常称为宏或宏定义.下面是宏的声明方式: #define name(parameter-list) ...