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 线程(七)等待与唤醒的更多相关文章

  1. Java线程的等待与唤醒完整示例代码

    项目结构: 资源类: 输入线程:  输出线程: 测试: 人妖问题发生: 线程安全问题的解决方法: 调用Object的wait()和notify()方法时需注意:必须是锁对象方可调用,否则将抛出无效的监 ...

  2. java多线程系类:基础篇:05线程的等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  3. Java并发编程之CountDownLatch,CyclicBarrier实现一组线程相互等待、唤醒

    java多线程应用场景不少,有时自己编写代码又不太容易实现,好在concurrent包提供了不少实现类,还有google的guava包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...

  4. 一 java线程的等待/通知模型

    java 中线程之间的通信问题,有这么一个模型:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程.前者是生产者,后者就是消费者 ...

  5. java线程的等待、通知机制【读书笔记】

    代码示例: package com.baidu.nuomi.concurrent; import java.text.SimpleDateFormat; import java.util.Date; ...

  6. java线程中的notifyAll唤醒操作

    注意: java中的notifyAll和notify都是唤醒线程的操作,notify只会唤醒等待池中的某一个线程,但是不确定是哪一个线程,notifyAll是针对指定对象里面的所有线程执行唤醒操作,指 ...

  7. java 线程同步方法执行与唤醒实例

    账号提钱.存钱实例方法 public class Account { private int balance; private int maxBalance; public Account(int b ...

  8. 线程的等待与唤醒,实现if...else里面的值交互依次输出

    线程通信原理图: 资源类: package com.yonyou.sci.gateway.exec.threadnet; public class Resource { String name; St ...

  9. Java线程(七):Callable和Future

    转自:http://blog.csdn.net/ghsau/article/details/7451464 本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果. C ...

  10. Java线程新特征——Java并发库

    一.线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...

随机推荐

  1. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-12底层驱动之液晶画点驱动

    视频简介:该视频介绍iCore3应用开发平台中液晶驱动的方法. 源视频包下载地址:链接:http://pan.baidu.com/s/1qXQoOQo 密码:gvgo 银杏科技优酷视频发布区:http ...

  2. (转)Windows系统白名单以及UAC机制

    用户帐户控制 深入了解 Windows 7 用户帐户控制 Mark Russinovich   概览: 标准用户帐户 用户帐户控制 内容 UAC 技术 提升与恶意软件安全性 Windows 7 中的不 ...

  3. 不平衡学习 Learning from Imbalanced Data

    问题: ICC警情数据分类不均,30+分类,最多的分类数据数量1w+条,只有10个类别数量超过1k,大部分分类数量少于100条. 解决办法: 下采样:通过非监督学习,找出每个分类中的异常点,减少数据. ...

  4. 常用curl测试命令

    1.curl 基础用法 2.curl 常用 3.curl 拓展 1.curl基础用法 语法:# curl [option] [url] curl除了用以请求数据,还可以用来上传下载 -A/--user ...

  5. EventBus vs Otto vs Guava--自定义消息总线

    同步发表于http://avenwu.net/ioc/2015/01/29/custom_eventbus Fork on github https://github.com/avenwu/suppo ...

  6. [Node.js] 01 - How to learn node.js

    基本概念 链接:https://www.zhihu.com/question/47244505/answer/105026648 链接:How to decide when to use Node.j ...

  7. U3D常用题

    最先执行的方法是:1.(激活时的初始化代码)Awake,2.Start.3.Update[FixUpdate.LateUpdate].4.(渲染模块)OnGUI.5.再向后,就是卸载模块(TearDo ...

  8. umi怎么去添加配置式路由

    今天在学习umi,他的路由机制非常的方便,但是在学到配置式路由的时候,看官方文档里面一笔带过: 对于我这种小萌新来说,有点懵,我需要把配置文件放到哪里呢?经过一番研究,发现它是放在根目录的.umirc ...

  9. 利用media query让背景图适应不同分辨率的设备

    随着上网方式的多样化,用户选择上网的工具不再仅是PC,而可以是手机,或者平板电脑.随之而来的问题是如何让网页适应不同分辨率,这给前端工程师们带来了新的挑战,其中重要的一点是如何让图片能在不同的分辨率下 ...

  10. Ubuntu下配置使用mysql

    很多生产环境都使用linux系统,相比于window系统,界面真的做的不够人性化,但是简洁高效也是linux的优点吧.在linux上使用mysql又是不一样的风景吧.