/*
线程间通讯:
多个线程在处理同一资源,但是任务却不同。
*/ package com.cwcec.test; class Input implements Runnable
{
Resource r;
public Input(Resource r)
{
this.r = r;
}
public void run()
{
int x = 0;
while(true)
{
synchronized (r)
{
if(x == 0)
{
r.name = "Mike";
r.sex = "nan";
}
else
{
r.name = "丽丽";
r.sex = "女";
}
x = (x + 1) % 2;
} }
}
} class Output implements Runnable
{
Resource r;
public Output(Resource r)
{
this.r = r;
}
public void run()
{
while(true)
{
synchronized (r)
{
System.out.println(r.name + "..." + r.sex);
} }
}
} class Resource
{
String name;
String sex;
} public class Person
{
public static void main(String[] args)
{ Resource r = new Resource();
Input in = new Input(r);
Output output = new Output(r); Thread t1 = new Thread(in);
Thread t2 = new Thread(output); t1.start();
t2.start();
}
}
Output:
Mike...nan
Mike...nan
Mike...nan
Mike...nan
Mike...nan
Mike...nan
Mike...nan
Mike...nan
Mike...nan
Mike...nan
丽丽...女
丽丽...女
丽丽...女
丽丽...女
丽丽...女
丽丽...女
丽丽...女
 
/*
等待/唤醒机制。 
 
涉及的方法:
 
1,wait(): 让线程处于冻结状态,被wait的线程会被存储到线程池中。
2,notify():唤醒线程池中一个线程(任意).
3,notifyAll():唤醒线程池中的所有线程。
 
这些方法都必须定义在同步中。
因为这些方法是用于操作线程状态的方法。
必须要明确到底操作的是哪个锁上的线程。
 
 
为什么操作线程的方法wait notify notifyAll定义在了Object类中? 
 
因为这些方法是监视器的方法。监视器其实就是锁。
锁可以是任意的对象,任意的对象调用的方式一定定义在Object类中。
class Input implements Runnable
{
Resource r;
public Input(Resource r)
{
this.r = r;
}
public void run()
{
int x = 0;
while(true)
{
synchronized (r)
{
if(r.flag)
{
try {
r.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} if(x == 0)
{
r.name = "Mike";
r.sex = "nan";
}
else
{
r.name = "丽丽";
r.sex = "女";
} r.flag = true;
r.notify();
}
x = (x + 1) % 2; }
}
} class Output implements Runnable
{
Resource r;
public Output(Resource r)
{
this.r = r;
}
public void run()
{
while(true)
{
synchronized (r)
{
if(!r.flag)
try {
r.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(r.name + "..." + r.sex);
r.flag = false;
r.notify();
}
}
}
} class Resource
{
String name;
String sex;
boolean flag = false;
} public class Person
{
public static void main(String[] args)
{ Resource r = new Resource();
Input in = new Input(r);
Output output = new Output(r); Thread t1 = new Thread(in);
Thread t2 = new Thread(output); t1.start();
t2.start();
}
}
Output:
Mike...nan
丽丽...女
Mike...nan
丽丽...女
Mike...nan
丽丽...女
Mike...nan
丽丽...女
Mike...nan
丽丽...女
Mike...nan
 
程序优化:
class Input implements Runnable
{
Resource r;
public Input(Resource r)
{
this.r = r;
}
public void run()
{
int x = 0;
while(true)
{
if(x == 0)
{
r.set("Mike", "nan");
}
else
{
r.set("丽丽", "女");
} x = (x + 1) % 2; }
}
} class Output implements Runnable
{
Resource r;
public Output(Resource r)
{
this.r = r;
}
public void run()
{
while(true)
{
r.out();
}
}
} class Resource
{
private String name;
private String sex;
private boolean flag = false;
public synchronized void set(String name,String sex)
{
if(flag)
try {
this.wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
} public synchronized void out()
{
if(!flag)
try {
this.wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println(name + "...+" + sex);
flag = false;
this.notify();
} } public class Person
{
public static void main(String[] args)
{ Resource r = new Resource();
Input in = new Input(r);
Output output = new Output(r); Thread t1 = new Thread(in);
Thread t2 = new Thread(output); t1.start();
t2.start();
}
}
Output:
Mike...nan
丽丽...女
Mike...nan
丽丽...女
Mike...nan
丽丽...女
Mike...nan
丽丽...女
Mike...nan
丽丽...女
Mike...nan

Java 线程间通讯的更多相关文章

  1. Java 线程间通讯(共享变量方式)

    Java线程间通讯,最常用的方式便是共享变量方式,多个线程共享一个静态变量就可以实现在线程间通讯,但是这需要注意的就是线程同步问题. 一.没考虑线程同步: package com.wyf; publi ...

  2. Java 线程间通讯(管道流方式)

    一.管道流是JAVA中线程通讯的常用方式之一,基本流程如下: 1)创建管道输出流PipedOutputStream pos和管道输入流PipedInputStream pis 2)将pos和pis匹配 ...

  3. JMM之Java线程间通讯——等待通知机制及其经典范式

    在并发编程中,实际处理涉及两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体). 通信是指线程之间以何种机制来交换信息.在共享内存的并发模型里,线程之间共享程序的公共状 ...

  4. java 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)

    参考文章:http://ifeve.com/java-concurrency-thread-directory/ 其中的竞态,线程安全,内存模型,线程间的通信,java ThreadLocal类小节部 ...

  5. 黑马程序员——JAVA基础之多线程的线程间通讯等

    ------- android培训.java培训.期待与您交流! ---------- 线程间通讯: 其实就是多个线程在操作同一个资源,但是动作不同. wait(); 在其他线程调用此对象的notif ...

  6. (转载)Java里快如闪电的线程间通讯

    转自(http://www.infoq.com/cn/articles/High-Performance-Java-Inter-Thread-Communications) 这个故事源自一个很简单的想 ...

  7. Java中快如闪电的线程间通讯

    这个故事源自一个很简单的想法:创建一个对开发人员友好的.简单轻量的线程间通讯框架,完全不用锁.同步器.信号量.等待和通知,在Java里开发一个轻量.无锁的线程内通讯框架:并且也没有队列.消息.事件或任 ...

  8. Java 里快如闪电的线程间通讯

    这个故事源自一个很简单的想法:创建一个对开发人员友好的.简单轻量的线程间通讯框架,完全不用锁.同步器.信号量.等待和通知,在Java里开发一个轻量.无锁的线程内通讯框架:并且也没有队列.消息.事件或任 ...

  9. 【转】JAVA 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)

    原文地址:https://www.cnblogs.com/edenpans/p/6020113.html 参考文章:http://ifeve.com/java-concurrency-thread-d ...

随机推荐

  1. watir-webdriver 中根据html5中的data-*属性设置元素

    def jscript(key="",*hashdict) key_dict=hashdict[0].keys[0] value_dict=hashdict[0][key_dict ...

  2. React-Native StyleSheet属性支持

    /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is lice ...

  3. [2016北京集训试题6]魔法游戏-[博弈论-sg函数]

    Description Solution 首先,每个节点上的权值可以等价于该节点上有(它的权的二进制位数+1)个石子,每次可以拿若干个石子但不能不拿. 然后就发现这和NIM游戏很像,就计算sg函数em ...

  4. iOS开发-通过正则表达式进行各种判断银行卡,车牌号,邮箱地址,QQ,身份证,全字母,仅输入字母或数字同时包含大小写字母和数字,仅能输入中文等

    /* *  验证银行卡号是否正确 *  车牌号验证 *  检验邮箱地址是否正确 *  手机号中间四位密文显示 *  判断QQ号是否正确(5-11位) *  判断身份证号是否正确(如末位为字母请用“x” ...

  5. Linux下nginx编译安装教程和编译参数详解

    这篇文章主要介绍了Linux下nginx编译安装教程和编译参数详解,需要的朋友可以参考下 一.必要软件准备1.安装pcre 为了支持rewrite功能,我们需要安装pcre 复制代码代码如下: # y ...

  6. js简单时间比较的方法(转)

    //时间比较(yyyy-MM-dd) function compareDate(startDate, endDate) {   var arrStart = startDate.split(" ...

  7. Vue渲染数据理解以及Vue指令

    一.Vue渲染数据原理 原生JS改变页面数据,必须要获取页面节点,也即是进行DOM操作,jQuery之类的框架只是简化DOM操作的写法,实质并没有改变操作页面数据的底层原理,DOM操作影响性能(导致浏 ...

  8. 树莓派UPS-18650,添加时钟

    1.简介 UPS-18650 是一个专门为树莓派(以下简称 pi)所设计的 UPS 电源,采用两颗标准 的 18650 锂电池进行供电,支持外部电源插入检测,支持边充边放,既插上外部电源时, pi 由 ...

  9. 一句话打印'*'图案(列表推导式, 人生苦短, 我用Python)

    ```python # coding=utf-8 print ('\n'.join(['*'*6 for i in range(4)])) # ****** # ****** # ****** # * ...

  10. js数组知识点总结及经典笔试题

    1.判断数组 这是笔试里经常会出现的知识考察点,总结一下 (1)Array.isArray()方法判断 var a=[]; Array.isArray(a) //返回true var b='hello ...