线程通讯 |
等待唤醒Object方法实现类:
package socketDemo;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 线程通讯-等待唤醒Object方法
*
* @author yb
*
*/
public class OddEvenDemo {
private int i = 0;// 要打印的数
private Object obj = new Object();
// private Lock lock = new ReentrantLock();// 不用公平锁ReentrantLock(true),该处都是独占
// private Condition condition = lock.newCondition();
/**
* 奇数打印方法,有奇数线程调用
*/
public void odd() {
while (i < 10) {
// lock.lock();
// try {
synchronized (obj) {
// 1.判断i是否小于10,
// 2.打印奇数
if (i % 2 == 1) {
System.out.println("奇数:" + i);
i++;
obj.notify();// 唤醒偶数线程打印
// condition.signal();// 唤醒偶数线程打印
} else {
try {
obj.wait();// 等待偶数线程打印完毕
// condition.await();// 等待偶数线程打印完毕
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// } finally {
// lock.unlock();
//
// }
}
}
/**
* 偶数打印方法,由偶数线程调用
*/
public void even() {
while (i < 10) {
// lock.lock();
// try {
synchronized (obj) {
// 1.判断i是否小于10,
// 2.打印偶数
if (i % 2 == 0) {
System.out.println("偶数:" + i);
i++;
obj.notify();// 唤奇数数线程打印
// condition.signal();// 唤奇数数线程打印
} else {
try {
obj.wait();// 等待奇数线程打印完毕
// condition.await();// 等待奇数线程打印完毕
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// } finally {
// lock.unlock();
//
// }
}
}
public static void main(String[] args) {
final OddEvenDemo oddEvenDemo = new OddEvenDemo();
// 1.开启奇数线程打印
Thread thread1 = new Thread(new Runnable() {
public void run() {
oddEvenDemo.odd();
}
});
Thread thread2 = new Thread(new Runnable() {
public void run() {
oddEvenDemo.even();
}
});
thread1.start();
thread2.start();
}
}
运行结果截图: