/*
线程间通讯:
多个线程在处理同一资源,但是任务却不同。
*/ 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. 基于STM32F103ZET6 HC_SR04超声波测距模块

    这是最后的实验现象,改变不同的角度即可测得距离 板子 PZ6806L 超声波模块 HC_SR04 HC_SR04模块讲解 通过该超声波模块说明书,可明白供电需VCC 5V  还需GND  ECHO(回 ...

  2. 批量分离SQL数据库语句

    --sp_helpdb--查看可用数据库 declare @name sysname, @sql nvarchar(4000) DECLARE roy CURSOR FOR --排除不分离的数据库名就 ...

  3. 2017-2018-2 20155315《网络对抗技术》Exp2:后门原理与实践

    实验目的 学习建立一个后门连接. 教程 实验内容 使用netcat获取主机操作Shell,cron启动. 使用socat获取主机操作Shell, 任务计划启动. 使用MSF meterpreter(或 ...

  4. EDB*Plus的client_encoding问题

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackga ...

  5. 8-[表操作]--foreign key、表与表的关系

    1. foreign key (1)快速理解foreign key 员工信息表有三个字段:工号 姓名 部门 公司有3个部门,但是有1个亿的员工,那意味着部门这个字段需要重复存储,部门名字越长,越浪费 ...

  6. 【LG3248】[HNOI2016]树

    [LG3248][HNOI2016]树 题面 洛谷 题解 因为每次你加入的点是原树上某一棵子树 那么我们一次加入一个点,代表一棵子树加到大树下面 那么我们要找到一个点在一个大点中用主席树在\(dfs\ ...

  7. setInterval只执行一次的原因

    setInterval(arrow(),) 改为: setInterval(arrow,) 原因: arrow()这是一个函数调用,函数调用就会有返回值, 而arrow()没有返回值,所以这里的arr ...

  8. python-我的第一门编程语言

    一.认识python是一个偶然,由于大学不务正业,混迹于各种电脑维修群(本人专业商务经济专业),了解过C.JAVA.HTML5以及世界上最好的编程语言PHP and so on!了解也仅仅是了解. 二 ...

  9. Unity依赖注入(笔记)

    一.介绍 控制反转(Inversion of Control,简称IoC):整洁架构思想,不允许内部获知外部的存在,这就导致了我们必须在内层定义与外层交互的接口,通过依赖注入的方式将外层实现注入到内部 ...

  10. renren_fast性能测试平台的安装部署

    1.从GitHub下载源码: https://github.com/zyanycall/stressTestPlatform git clone https://github.com/zyanycal ...