/*
线程间通讯:
多个线程在处理同一资源,但是任务却不同。
*/ 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. webdriver 获取页面response

    在selenium webdriver实现自动化抓取数据过程中,发现无法从webdriver获取页面response 查来查去最终在 stackoverflow 上找到了这一篇文章 文章中说:webd ...

  2. 使用xadmin搜索search_fields报错:Related Field got invalid lookup: icontains

    一.问题描述 使用xadmin实现Django后台功能时,使用search_fields = [字段名,字段名],在搜索的时候报错Related Field got invalid lookup: i ...

  3. ASP 读写文件FSO,adodb.stream

    例如静态化页面的时候 总结:用server.CreateObject("adodb.stream") 来读写比较好,可避免乱码和读取到多余的字符.....不推荐 "scr ...

  4. 第六周课上测试-1-ch02

    第六周课上测试-1-ch02 1. 要求: 1.参考附图代码,编写一个程序 "week0601学号.c",判断一下你的电脑是大端还是小端. 2. 提交运行结果"学号XXX ...

  5. VC编译连接选项详解

    VC编译连接选项详解 大家可能一直在用VC开发软件,但是对于这个编译器却未必很了解.原因是多方面的.大多数情况下,我们只停留在“使用”它,而不会想去“了解”它.因为它只是一个工具,我们宁可把更多的精力 ...

  6. C++实现tar包解析

    tar(tape archive)是Unix和类Unix系统上文件打包工具,可以将多个文件合并为一个文件,使用tar工具打出来的包称为tar包.一般打包后的文件名后缀为".tar" ...

  7. CentOS7 初始化配置

    一.在安装的时候配置网卡名称的参数 . 选择“Install Centos ” . 按Tab,打开kernel启动选项后,增加 net.ifnames= biosdevname= 二.最小化安装完成之 ...

  8. Quartz可以用来做什么

    废话的前言 以前凭借年轻,凡事都靠脑记.现在工作几年后发现,很多以前看过.用过的东西,再次拿起的时候总觉得记不牢靠."好记性不如烂笔头"应该是某位上了年纪的大叔的切肤之痛(仅次于上 ...

  9. MUI的踩坑笔记

    最近在做公司项目的手机端实现,稍微记录下遇到的坑 1.在app开发中,若要使用HTML5+扩展api,必须等plusready事件发生后才能正常使用,mui将该事件封装成了mui.plusReady( ...

  10. 从零开始的Python学习Episode 21——socket基础

    socket基础 网络通信要素: A:IP地址   (1) 用来标识网络上一台独立的主机 (2) IP地址 = 网络地址 + 主机地址(网络号:用于识别主机所在的网络/网段.主机号:用于识别该网络中的 ...