Java 线程间通讯

时间:2023-03-08 17:30:34
/*
线程间通讯:
多个线程在处理同一资源,但是任务却不同。
*/ 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