144_多线程(线程间通信-等待唤醒机制)
2015-10-20 18:35
417 查看
class Res{
String name;
String sex;
boolean flag = false;
}
class Input implements Runnable{
private Res r;
Input(Res r){
this.r = r;
}
public void run(){
int x = 0;
while(true){
synchronized(r){
if(r.flag)
try{r.wait();}catch(Exception e){}
if(x==0){
r.name = "mike";
r.sex = "man";
}
else{
r.name = "哈哈";
r.sex = "女";
}
x = (x+1)%2;
r.flag = true;
r.notify();
}
}
}
}
class Output implements Runnable{
private Res r;
Output(Res r){
this.r = r;
}
public void run(){
while(true){
synchronized(r){
if(!r.flag)
try{r.wait();}catch(Exception e){}
System.out.println(r.name+"--"+r.sex);
r.flag = false;
r.notify();
}
}
}
}
class InputOutput{
public static void main(String[] args){
Res r = new Res();
Input in = new Input(r);
Output out = new Output(r);
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
t1.start();
t2.start();
}
}
/*
wait();notify();notifyAll();
都使用在同步中,因为要对持有监视器(锁)的线程中操作。
所以要使用在同步中,因为只有同步才具有锁。
为什么这些操作线程的方法要定义在Object类中呢?
因为这些方法在操作同步的线程时,都必须要标识它们所操作
线程持有的锁。只有同一个锁上的被等待线程,可以被同一个锁上的
notify唤醒。不可以对不同锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。
而锁可以是任意对象,所以可以被任意对象调用的方法定义在Object
类中。
*/
代码优化
class Res{
private String name;
private String sex;
private boolean flag = false;
public synchronized void set(String name,String sex){
if(flag){
try{this.wait();}catch(Exception e){}
}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}
public synchronized void out(){
if(!flag){
try{this.wait();}catch(Exception e){}
}
System.out.println(name+"--"+sex);
flag = false;
this.notify();
}
}
class Input implements Runnable{
private Res r;
Input(Res r){
this.r = r;
}
public void run(){
int x = 0;
while(true){
if(x==0){
r.set("mike","man");
}
else{
r.set("哈哈","女");
}
x = (x+1)%2;
}
}
}
class Output implements Runnable{
private Res r;
Output(Res r){
this.r = r;
}
public void run(){
while(true){
r.out();
}
}
}
class InputOutput{
public static void main(String[] args){
Res r = new Res();
new Thread(new Input(r)).start();
new Thread(new Output(r)).start();
/*Input in = new Input(r);
Output out = new Output(r);
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
t1.start();
t2.start();*/
}
}
相关文章推荐
- (九)Java入门--多线程(4)线程通信--等待唤醒机制
- java多线程——线程间通信之线程等待唤醒机制
- java多线程之 生产者和消费者 线程间通信 等待与唤醒机制
- 24-多线程(线程间通信-等待唤醒机制)1 2图解 3 25-多线程(线程间通信-等待唤醒机制-代码优化)
- 多线程之间的通信(等待唤醒机制、Lock 及其它线程的方法)
- Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解
- Java多线程四:线程间通信/等待唤醒机制
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- 多线程(线程间通信-等待唤醒机制及其代码优化)
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- java多线程:线程的通信、唤醒等待机制、生产消费者模式、Lock
- Java基础学习5_多线程(线程间通信--等待唤醒机制)
- java多线程(2):线程通信之生产者消费者模式及等待唤醒机制
- JavaSE 多线程 线程间通信— 等待唤醒机制
- 【多线程】线程通信之等待/通知机制
- 线程间的通信------------等待唤醒机制
- Java 线程间通信-等待唤醒机制
- 线程间的通信--等待唤醒机制
- 利用等待唤醒机制实现线程间的通信
- 线程间通信--等待唤醒机制