使用wait()和notify()方法实现以下需求:
使用生产者和消费者模式实现,交替输出:
假设只有两个线程,输出以下结果:
奇数---->1
偶数---->2
奇数---->3
偶数---->4
奇数---->5
偶数---->6
奇数---->7
偶数---->8
……
要求:必须交替,并且t1线程负责输出奇数,t2线程负责输出偶数。
public class Test {
//主线程
public static void main(String[] args) {
//先把Num new出来,从1开始数
Num num = new Num(1);
//创建两个线程,一个负责数奇数、一个负责数偶数
Thread t1 = new Thread(new odd(num));
Thread t2 = new Thread(new even(num));
//对两个线程进行命名
t1.setName("奇数");
t2.setName("偶数");
//开始数数
t1.start();
t2.start();
}
}
/**Num类,作为两个线程共享对象*/
class Num{
private int i;
public Num(int i) {
this.i = i;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
/**奇数线程*/
class odd implements Runnable{
//声明共有对象Num
Num num;
@Override
public void run() {
//死循环,让它一直数数
while (true){
//线程安全的,锁num,加判断是否为奇数
synchronized (num){
if((num.getI())%2==0){
try {
//暂停且解锁
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() +"---->"+ num.getI());
try {
//由于电脑速度较快,在这里设置睡眠时间1秒容易看前面的变化。
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//对num的i进行+1处理
num.setI(num.getI()+1);
//唤醒
num.notify();
}
}
}
public odd(Num num) {
this.num = num;
}
}
/**偶数线程*/
class even implements Runnable{
Num num;
@Override
public void run() {
while (true) {
synchronized (num) {
if ((num.getI()) % 2 == 1) {
try {
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "---->" + num.getI());
num.setI(num.getI()+1);
num.notify();
}
}
}
public even(Num num) {
this.num = num;
}
}
网友评论