Javaスレッド間の通信、ウェイクアップ待ちメカニズム
4499 ワード
public class ThreadNotifySample {
public static void main(String[] args) {
// Res res = new Res();
// Input input = new Input(res);
// Output output = new Output(res);
// Thread t1 = new Thread(input);
// Thread t2 = new Thread(output);
// t1.start();
// t2.start();
/**
*
* hangsan----male
* zhangsan----male
* zhangsan----male
* zhangsan----
* ----
* ----
* ----male
* ----male
* ----
* */
// , ,input ,output
Res res = new Res();
Input2 i2 = new Input2(res);
Output2 o2 = new Output2(res);
Thread t3 = new Thread(i2);
Thread t4 = new Thread(o2);
t3.start();
t4.start();
/**
*
* zhangsan----male
* ----
* zhangsan----male
* ----
* zhangsan----male
* ----
* zhangsan----male
* ----
* zhangsan----male
* ----
*/
}
}
class Res {
String userName;
String userSex;
boolean flag;
}
class Input implements Runnable {
private Res res;
Input(Res res) {
this.res = res;
}
@Override
public void run() {
int x = 0;
while (true) {
if (x == 0) {
res.userName = "zhangsan";
res.userSex = "male";
} else {
res.userName = " ";
res.userSex = " ";
}
x = (x + 1) % 2;
}
}
}
class Output implements Runnable {
private Res res;
Output(Res res) {
this.res = res;
}
@Override
public void run() {
while (true) {
System.out.println(res.userName + "----" + res.userSex);
}
}
}
class Input2 implements Runnable {
private Res res;
Input2(Res res) {
this.res = res;
}
@Override
public void run() {
int x = 0;
while (true) {
synchronized (res) { // ,
if (res.flag) {
try {
res.wait(); // Output2 Output2
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
if (x == 0) {
res.userName = "zhangsan";
res.userSex = "male";
} else {
res.userName = " ";
res.userSex = " ";
}
x = (x + 1) % 2;
res.flag = true; //
res.notify(); // Output2
}
}
}
}
}
class Output2 implements Runnable {
private Res res;
Output2(Res res) {
this.res = res;
}
@Override
public void run() {
while (true) {
synchronized (res) { // ,
if (res.flag) { // ,
System.out.println(res.userName + "----" + res.userSex);
res.flag = false; //
res.notify(); // Input2
} else {
try {
res.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}