线程通信_交替打印案例
/**
* wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。
* 这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。
*
* todo 如果对象调用了wait方法就会使持有该对象的线程把对象的控制权交出去,然后处于等待状态
* todo 如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行
* todo 如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行
*
* todo 注意 wait() 方法的调用必须放在synchronized方法或synchronized快中
*/
/**
* wait与sleep区别
*
* todo 对于sleep() 方法,我们首先要知道方法是属于Thread类中的,而wait() 方法,则属于object类中的。
* todo sleep() 方法导致了程序暂停执行指定的时间,让出cpu给其他线程,但是它的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态
* todo 在调用sleep() 方法的过程中,线程不会释放对象锁而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定时,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态
*/
public class D1_线程通信_交替打印案例 {
public static void main(String[] args) {
NumberMode numberMode = new NumberMode();
new Thread(new PrintjiNum(numberMode)).start();
new Thread(new PrintOuNum(numberMode)).start();
}
static class NumberMode {
public int mum = 1;
}
static class PrintjiNum implements Runnable {
NumberMode numberMode;
public PrintjiNum(NumberMode numberMode) {
this.numberMode = numberMode;
}
@Override
public void run() {
while (numberMode.mum < 100) {
synchronized (numberMode) {
if (numberMode.mum % 2 != 0) {
System.out.println("奇数" + numberMode.mum);
numberMode.mum++;
numberMode.notify();
} else {
try {
System.out.println("奇数线程休息");
numberMode.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
static class PrintOuNum implements Runnable {
NumberMode numberMode;
public PrintOuNum(NumberMode numberMode) {
this.numberMode = numberMode;
}
@Override
public void run() {
while (numberMode.mum < 100) {
synchronized (numberMode) {
if (numberMode.mum % 2 == 0) {
System.out.println("偶数:" + numberMode.mum);
numberMode.mum++;
numberMode.notify();
} else {
try {
numberMode.wait();
System.out.println("偶数线程休息");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
}