package com.mozq.thread.resource2;
/**
* 创建2个线程,一个写入人员信息,一个读取人员信息
*
* @author jie
*
*/
class Resource {
private String name;
private String sex;
private boolean set = false;
public synchronized void set(String name, String sex) {
//如果有数据等待
if(set) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//没有数据则写入数据
this.name = name;
this.sex = sex;
this.set = true;
//通知其他线程来处理数据
this.notify();
}
public synchronized void out() {
//如果没有数据读,等待
if(!set) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//读取数据
System.out.println(this.name + "..." + this.sex);
set = false;
//通知写线程写入数据
this.notify();
}
}
class Input extends Thread {
private Resource r;
public Input(Resource r) {
this.r = r;
}
@Override
public void run() {
boolean flag = true;
while (true) {
if (flag) {
r.set("刘备","男");
} else {
r.set("小乔","女");
}
flag = !flag;
}
}
}
class Output extends Thread {
private Resource r;
public Output(Resource r) {
this.r = r;
}
@Override
public void run() {
while (true) {
r.out();
}
}
}
public class ResourceDemo {
public static void main(String[] args) {
/*
//创建资源
Resource r = new Resource();
//创建任务线程
Input in = new Input(r);
Output out = new Output(r);
//开启线程
in.start();
out.start();
*/
//创建资源,在单线程中,必须顺序依次调用set和out方法,否则会造成单线程一直等待。
Resource r = new Resource();
r.set("刘备", "男");
r.set("刘备", "男");
r.out();
}
}