/*
有两个线程 一个给名字和性别赋值(input) 一个输出名字和性别(output)
但会一下输出很多同样的名字和性别(cpu没切走)
用等待唤醒机制 就可以 1 赋值一个 然后input wait 唤醒output 2 输出一个 output wait 再唤醒input
这样可以赋值一个 就输出一个
等待/唤醒机制。
涉及的方法:
1 wait(); 让线程处于冻结状态,被wait的线程会被存储到线程池(等待集)中
2 notify();唤醒线程池中的一个线程(任意)
3 notifyAll();唤醒线程池中的所有线程
这些方法必须定义在同步中
因为这些方法是用于操作线程状态的方法
必须要明确到底操作的是哪个锁上的线程
为什么操作线程的方法wait notify notifyAll 定义在Object类中
因为这些方法是监视器的方法,监视器就是锁
锁可以是任意对象,任意的对象调用的方法一定定义在Object中
*/
class Resource{
String name;
String sex;
boolean flag=false;
}
class Input implements Runnable{
Resource r;
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){
}
}
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;
Output(Resource r){
this.r=r;
}
public void run(){
while(true){
synchronized(r){
if(!r.flag){
try{
r.wait();
}
catch(InterruptedException e){
}
}
System.out.println(r.name+"------"+r.sex);
r.flag=false;
r.notify();
}
}
}
}
class ResourceDemo2{
public static void main(String[] args) {
//创建资源
Resource r=new Resource();
//创建任务
Input in =new Input(r);
Output out =new Output(r);
//创建线程,执行路径
Thread t1=new Thread(in);
Thread t2=new Thread(out);
t1.start();
t2.start();
}
}
优化代码
class Resource{
private String name;
private String sex;
private boolean flag=false;
public synchronized void set(String name,String sex){
if(flag){
try{
wait();
}
catch(InterruptedException e){
}
}
this.name=name;
this.sex=sex;
flag=true;
notify();
}
public synchronized void out(){
if(!flag){
try{
wait();
}
catch(InterruptedException e){
}
}
System.out.println("name"+name+"====="+"sex"+sex);
flag=false;
notify();
}
}
class Input implements Runnable{
Resource r;
Input (Resource r){
this.r=r;
}
public void run(){
int x=0;
while(true){
if(x==0){
r.set("mike","nan");
}
else{
r.set("莉莉","nvnvnvnvnvnv");
}
x=(x+1)%2;
}
}
}
class Output implements Runnable{
Resource r;
Output(Resource r){
this.r=r;
}
public void run(){
while(true){
r.out();
}
}
}
class ResourceDemo3{
public static void main(String[] args) {
//创建资源
Resource r=new Resource();
//创建任务
Input in =new Input(r);
Output out =new Output(r);
//创建线程,执行路径
Thread t1=new Thread(in);
Thread t2=new Thread(out);
t1.start();
t2.start();
}
}