java 线程(七)等待与唤醒
package cn.sasa.demo5;
public class Resources {
private String name;
private boolean gender;
//标记
public boolean flag;
//如果falg==true ,赋值完成
//如果flag==false 取值完成
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
private Resources() {}
public static final Resources resource = new Resources();
}
package cn.sasa.demo5;
public class InputRunnable implements Runnable{
private Resources rs = Resources.resource;
@Override
public void run() {
int flag = 1000;
while(flag > 0) {
synchronized(rs) { //input 和 output 两个线程操作同一个数据源,必须保证同步锁是同一个锁
if(rs.flag) {
try {
rs.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(flag % 2 ==0) {
rs.setName("来福");
rs.setGender(true);
}else {
rs.setName("wangcai");
rs.setGender(false);
}
rs.flag=true;
rs.notify();
flag--;
}
}
}
/**
* 等待 唤醒机制
*
* input先拿到cup的执行资源,wait(),等待output输出
*
* output输出后,notify()唤醒input,自己再wait()
*
* input被唤醒后继续执行,执行完后,notify() output线程,自己再wait()
*/
}
package cn.sasa.demo5;
public class OutputRunnable implements Runnable{
private Resources rs = Resources.resource;
@Override
public void run() {
int flag = 1000;
while(flag > 0) {
synchronized(rs) { //input 和 output 两个线程操作同一个数据源,必须保证同步锁是同一个锁
if(!rs.flag) {
try {
rs.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(rs.getName() + "======" + rs.isGender() );
rs.flag=false;
rs.notify();
flag--;
}
}
}
}
package cn.sasa.demo5;
public class Test {
public static void main(String[] args) {
Runnable input = new InputRunnable();
Runnable output = new OutputRunnable();
new Thread(input).start();
new Thread(output).start();
}
}
java 线程(七)等待与唤醒的更多相关文章
- Java线程的等待与唤醒完整示例代码
项目结构: 资源类: 输入线程: 输出线程: 测试: 人妖问题发生: 线程安全问题的解决方法: 调用Object的wait()和notify()方法时需注意:必须是锁对象方可调用,否则将抛出无效的监 ...
- java多线程系类:基础篇:05线程的等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- Java并发编程之CountDownLatch,CyclicBarrier实现一组线程相互等待、唤醒
java多线程应用场景不少,有时自己编写代码又不太容易实现,好在concurrent包提供了不少实现类,还有google的guava包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...
- 一 java线程的等待/通知模型
java 中线程之间的通信问题,有这么一个模型:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程.前者是生产者,后者就是消费者 ...
- java线程的等待、通知机制【读书笔记】
代码示例: package com.baidu.nuomi.concurrent; import java.text.SimpleDateFormat; import java.util.Date; ...
- java线程中的notifyAll唤醒操作
注意: java中的notifyAll和notify都是唤醒线程的操作,notify只会唤醒等待池中的某一个线程,但是不确定是哪一个线程,notifyAll是针对指定对象里面的所有线程执行唤醒操作,指 ...
- java 线程同步方法执行与唤醒实例
账号提钱.存钱实例方法 public class Account { private int balance; private int maxBalance; public Account(int b ...
- 线程的等待与唤醒,实现if...else里面的值交互依次输出
线程通信原理图: 资源类: package com.yonyou.sci.gateway.exec.threadnet; public class Resource { String name; St ...
- Java线程(七):Callable和Future
转自:http://blog.csdn.net/ghsau/article/details/7451464 本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果. C ...
- Java线程新特征——Java并发库
一.线程池 Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...
随机推荐
- [Linux]linux如何把文件切成多块
转:https://blog.csdn.net/qq_42224274/article/details/80880914 将一个大文件分成若干个小文件方法例如将一个BLM.txt文件分成前缀为 BLM ...
- 【原】使用Json作为Python和C#混合编程时对象转换的中间文件
一.Python中自定义类对象json字符串化的步骤[1] 1. 用 json 或者simplejson 就可以: 2.定义转换函数: 3. 定义类 4. 生成对象 5.dumps执行,引入转换函 ...
- hdoj:2034
#include <iostream> #include <vector> #include<algorithm> //包含sort函数 using namespa ...
- Java注解小记
java注解是jdk1.5以后新出的特性,注解提升了Java语言的表达能力,有效地实现了应用功能和底层功能的分离,框架/库的程序员可以专注于底层实现. 1.Java内置注解 主要有三个: @Overr ...
- @Transactional(rollbackFor = Exception.class)
@Transactional(rollbackFor = Exception.class)这个注解只有在出异常时才会回滚,需要回滚时没有异常也要人为制造异常(自定义异常)所以,如果使用了异常捕获,很有 ...
- Java如何替换所有指定(出现)的字符串?
在Java编程中,如何替换所有指定(出现)的字符串? 以下示例演示如何使用Matcher类的replaceAll()方法替换字符串中的所有出现的子字符串. package com.yiibai; im ...
- H3C ER6300 + 两台 H3C S5120 组网举例
组网需求: 1.H3C ER6300 作出口路由.防火墙及Qos限速等功能(ER6300 配置LAN口 192.168.30.254默认网关) 2.H3C S5120 两台配置相同VLAN10 VLA ...
- php 页面间传递数据
b.php <?php function getClientIP() { if (getenv("HTTP_CLIENT_IP")) $ip = getenv("H ...
- Angular4学习笔记(三)- 路由
路由简介 路由是 Angular 应用程序的核心,它加载与所请求路由相关联的组件,以及获取特定路由的相关数据.这允许我们通过控制不同的路由,获取不同的数据,从而渲染不同的页面. 相关的类 Routes ...
- 【Oracle-PLsql】使用存储过程,利用table集合类型开发复杂业务报表
在一般的项目中,都需要开发一些报表,少则几个字段,多则几十个字段,需要关联的表可能多达十几.几十张表,如果想要使用一个SQL语句将这几十张表关联起来 查询所需要的字段,当你听到这里的时候,你的脑子可能 ...