/*想模拟的场景:
小明作为一个线程执行的对象,他可以看书,等另一个烧水线程的水烧开后,通知小明停止看书去喝茶。
我自己摸索的代码如下:
还有以下疑问:
烧水的线程把水烧开后,它能否直接让小明这个线程停止看书,转而去喝茶。不是用我例子中的这种停止方式。
就是说a线程能否主动让b线程终止b正在执行的代码,转而让b去执行另一些代码?
*/
public class Xiaoming {
public boolean isWaterOK = false;
public int pageNum = 1;
public Object obj;
public Xiaoming(Object obj) {
this.obj = obj;
}
public synchronized void setWaterOK(boolean waterOK) {
isWaterOK = waterOK;
}
public void boilTheWater(Kettle kettle) {
kettle.beBoiled();
}
public void readBook(int i) {
System.out.println(Thread.currentThread().getName() + " 小明:看书" + i);
}
public void drinkTea() {
System.out.println(Thread.currentThread().getName() + " 小明:喝茶...");
}
public static void main(String[] args) {
Object obj = new Object();
Xiaoming xiaoming = new Xiaoming(obj);
Kettle kettle = new Kettle(xiaoming, obj);
MyThread1 myThread1 = new MyThread1(xiaoming, kettle);
myThread1.setName("线程-1");
myThread1.start();
MyThread2 myThread2 = new MyThread2(xiaoming, kettle);
myThread2.setName("线程-2");
myThread2.start();
}
}
class MyThread1 extends Thread {
Xiaoming mXiaoming;
Kettle kettle;
public MyThread1(Xiaoming xiaoming, Kettle kettle) {
mXiaoming = xiaoming;
this.kettle = kettle;
}
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (mXiaoming.obj) {
if (kettle.temperature < 100) {
mXiaoming.boilTheWater(kettle);
} else {
return;
}
}
}
}
}
class MyThread2 extends Thread {
Xiaoming mXiaoming;
Kettle kettle;
public MyThread2(Xiaoming xiaoming, Kettle kettle) {
mXiaoming = xiaoming;
this.kettle = kettle;
}
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (mXiaoming.obj) {
if (!mXiaoming.isWaterOK) {
mXiaoming.readBook(mXiaoming.pageNum);
mXiaoming.pageNum++;
} else {
break;
}
}
}
mXiaoming.drinkTea();
}
}
class Kettle {
Xiaoming mXiaoming;
public int temperature = 0;
Object obj;
public Kettle(Xiaoming xiaoming, Object obj) {
mXiaoming = xiaoming;
this.obj = obj;
}
public void beBoiled() {
if (temperature < 100) {
temperature++;
} else {
return;
}
System.out.println(Thread.currentThread().getName() + " 茶壶:烧水 水温:" + temperature);
if (temperature == 100) {
mXiaoming.setWaterOK(true);
}
}
}