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 是一流的面向对象语言 ...
随机推荐
- 关于“Cannot resolve table 'user'”报错的问题解决
springboot+vue建立映射时,后端引用@Table(name="user") 来对应表名 user,但引用后报错"Cannot resolve table 'u ...
- 基于tensorflow的文本分类总结(数据集是复旦中文语料)
代码已上传到github:https://github.com/taishan1994/tensorflow-text-classification 往期精彩: 利用TfidfVectorizer进行 ...
- Python实现微信支付(三种方式)
Python实现微信支付(三种方式) 关注公众号"轻松学编程"了解更多. 如果需要python SDk源码,可以加我微信[1257309054] 在文末有二维码. 一.准备环境 1 ...
- GitHub 上适合新手的开源项目(Python 篇)
作者:HelloGitHub-卤蛋 随着 Python 语言的流行,越来越多的人加入到了 Python 的大家庭中.为什么这么多人学 Python ?我要喊出那句话了:"人生苦短,我用 Py ...
- Jmeter(二十六) - 从入门到精通 - 搭建开源论坛JForum(详解教程)
1.简介 今天这篇文章主要是给大家讲解一下,如何部署测试环境,这里宏哥部署一个开源测论坛,后边的文章中会用到这个论坛,并且也看到童鞋们在群里讨论如何在开发将测试包发给你以后,你如何快速地部署测试环境. ...
- leetcode37:path-sum-ii
题目描述 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum的路径, 例如: 给出如下的二叉树,sum=22, 5 / \ 4 8 / / ...
- Spider_基础总结6--动态网页抓取--selenium
# 有些网站使用 '检查元素'也不能够好使,它们会对地址进行加密,此时使用Selenium 调用浏览器渲染引擎可以模拟用户的操作,完成抓取: # 注:selenium既可以抓取静态网页也可以抓取动态网 ...
- CSS选择器组合符号
组合连接符号 无连接符 多项条件 空格符 后代节点 > 子节点 + 兄弟节点 ~ 兄弟节点 这里要注意+和~之间的区别 +是后面紧邻兄弟 ~是后面所有兄弟
- 第05组 Alpha冲刺 (3/6)(组长)
.th1 { font-family: 黑体; font-size: 25px; color: rgba(0, 0, 255, 1) } #ka { margin-top: 50px } .aaa11 ...
- nginx&http 第三章 ngx http ngx_http_process_request_headers
HTTP 请求行正确处理完成后,针对 HTTP/1.0 及以上版本紧接着要做的就是请求 HEADER 的处理与解析了 /** * 用于处理http的header数据 * 请求头: * Host: lo ...