用Java实现多线程打印奇偶数
- 1. wait()和 notify() 方法的作用:
- 2. Java实现
- (1)Thread1.class 奇数线程
- (2)Thread2.class 偶数线程
- (3)共享资源类
- (4)测试
1. wait()和 notify() 方法的作用:
wait():
①让正在当前线程(o对象上活动的线程)进入等待状态(Monitor中的waitSet)直到调用o.notify方法被唤醒为止。
②释放所占有的的对象锁
notify()
:
对象o.notify可以 唤醒 正在o对象上等待的线程。只是通知,不会释放对象锁;
2. Java实现
(1)Thread1.class 奇数线程
先判断当前num是否为奇数,如果是则不需要再打印奇数了;
如果是偶数,则num+1,再打印奇数;
class Thread1 implements Runnable{ //打印奇数
private Num num;
public Thread1(Num num) {
this.num = num;
}
@Override
public void run() {
while(true){
synchronized (num){
if(num.number%2!=0){ //目前是奇数,不需要打印
try {
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 不是奇数则+1打印奇数;
System.out.println(Thread.currentThread().getName()+
(++num.number));
num.notify();
}
}
}
}
(2)Thread2.class 偶数线程
先判断当前num是否为偶数,如果是则不需要再打印偶数了;
如果是奇数,则num+1,再打印即为偶数;
class Thread2 implements Runnable{//打印偶数
private Num num;
public Thread2(Num num) {
this.num = num;
}
@Override
public void run() {
while(true){
synchronized (num){
if(num.number%2==0){ //目前是偶数,不需要打印偶数
try {
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 不是偶数则+1打印偶数;
System.out.println(Thread.currentThread().getName()+
(++num.number));
num.notify();
}
}
}
}
(3)共享资源类
由于synchronized()参数是共享对象不能是基本数据类型,所以创造一个Num类作为共享资源传入;
class Num{
int number=1;
}
(4)测试
建立共享资源对象;
创造两个线程对象,传入共享资源;
class test {
public static void main(String[] args) {
Num num=new Num();
Thread t1=new Thread(new Thread1(num));
Thread t2=new Thread(new Thread2(num));
t1.setName("奇数线程:");
t2.setName("偶数线程:");
t1.start();
t2.start();
}
}
效果:奇偶数交替打印