您的位置:首页 > 编程语言 > Java开发

java 多线程6 不同线程操作不同的任务 用r.wait()和r.notify()方法

2017-11-13 22:37 513 查看
1.普通多线程输入输出,会出现男女不分的情况:

package DuoThread;

import java.math.BigDecimal;

public class Test {
public static void main(String[] args) {
test1();

}

private static void test1() {
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 Input implements Runnable{
Resource r;
Input(Resource r){
this.r=r;
}

@Override
public void run() {
int x=0;
while (true){
synchronized (r){
if(r.isFlag()){
try {
r.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(x==0){
r.setName("chm");
r.setSex("boy");
}
else {
r.setName("莉莉莉莉莉莉");
r.setSex("女女女女女女");
}
r.setFlag(true);
r.notify();
}
x=(x+1)%2;
}
}
}
class Output implements Runnable{
Resource r;
Output(Resource r){
this.r=r;
}

@Override
public void run() {
while (true){
synchronized (r){
if(!r.isFlag()){
try {
r.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(r.getName()+"..."+r.getSex());
r.setFlag(false);
r.notify();
}
}
}
}

class  Resource{
private String name;
private String sex;
private boolean flag;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public boolean isFlag() {
return flag;
}

public void setFlag(boolean flag) {
this.flag = flag;
}
}


使用等待唤醒机制解决一片一片的问题
结果:



==========================================

4.优化整理代码:

============================================





怎么让丽丽-女不是一片一片的出,而是一个一个的出呢?用r.wait()和r.notify()方法









优化后代码如下:





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: