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. 聊聊Python中的生成器和迭代器

    Python中有两个重要的概念,生成器和迭代器,这里详细记录一下. 1. 生成器 什么是生成器呢? 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包 ...

  2. 嵌入式开发之UDP 丢包--- UDP 丢包控制方法

    0. 发送端可以,发送五次左右,再Sleep 1.调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失.对于这种情况可以修改接收 ...

  3. Git -- 自定义git样式

    在安装Git一节中,我们已经配置了user.name和user.email,实际上,Git还有很多可配置项. 比如,让Git显示颜色,会让命令输出看起来更醒目: $ git config --glob ...

  4. Linux 目录结构_004

    前言 Linux文件系统层次标准,英文全称Filesystem Hierarchy Standard,英文简称FHS. 由于利用Linux来开发产品的团队和个人实在太多了,如果每个人都以自己的想法来配 ...

  5. DOS、Mac 和 Unix 文件格式+ UltraEdit使用

    文件格式 区分DOS.Mac 和 Unix分别对应三种系统 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种 文件模式 区分ASCII模式和Binary模式  通常由系统决定,大多数 ...

  6. js实现选中文字 分享功能

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 设计模式 -创建型模式 ,python工厂模式 抽象工厂模式(1)

    工厂模式 import xml.etree.ElementTree as etree import json class JSONConnector: def __init__(self, filep ...

  8. linux Email 体系

    大致了解了DNS与邮件服务器之间的关系后,接下来我们介绍邮件到底是如何传送到目的邮件主机的.下面我们分成“寄信”与“收信”两个主要的邮件服务器使用方式进行介绍.先说明关于“寄信”的部分.通常我们都是使 ...

  9. Android定时执行和停止某任务

    一.定义全局变量 int runCount = 0;// 全局变量,用于判断是否是第一次执行 Handler handlerCount = new Handler(); 二.创建Runnable Ru ...

  10. 转载]PhpCms V9调用指定栏目子栏目文章的两种方法

    PhpCms V9调用指定栏目子栏目文章的两种方法 第一种.直接写子栏目id ,用cat in {pc:get sql="SELECT * from v9_news where status ...