循环打印积偶数 java_JAVA中使用线程交替打印奇偶数

packagepracticeagagin;public classTest {//private static Object OddTask;

public static voidmain(String args[]){

PrintNumber printNum= new PrintNumber(100);

EvenTask evenTask= newEvenTask(printNum);

OddTask oddTask= newOddTask(printNum);

Thread thread1= newThread(evenTask);

Thread thread2= newThread(oddTask);

thread1.start();

thread2.start();

}

}packagepracticeagagin;public classPrintNumber {protected int upBound;//定义打印数字的上界

protected int currentNum=0;public PrintNumber(intupBound){this.upBound =upBound;

}public intgetNum(){returncurrentNum;

}

}packagepracticeagagin;//这个类的作用是方便代码重用,减少代码量//因为无论是打印奇数,还是打印偶数,他们的工作流程可以看作是一样的//看打印机有没有在使用,有的话阻塞自己//看打印机有没有在使用,没有的话,看是否是自己可以打印的数;是则打印-打印结束唤醒其它进程;不是则阻塞自己(这里不用去唤醒了,阻塞后又怎么能唤醒别人呢?);//数字奇偶的判断,交给数字类来完成;数字类也一样提高了程序的代码质量

abstract class PrintTask implementsRunnable {protectedPrintNumber printNum;publicPrintTask(PrintNumber printNum) {this.printNum =printNum;

}

@Overridepublic voidrun() {while (printNum.currentNum < printNum.upBound) {//还没到达上界持续打印//打印操作,使用打印机需要上锁,通过原子操作控制同步

synchronized (printNum) {//查看打印机有没有在使用;有的话,其它线程阻塞在外面//没有,既可以打印//查看自己是否可以打印

if(isShouldPrint()) {

System.out.println(Thread.currentThread().getName()+"打印了"+printNum.getNum());

printNum.currentNum++;

printNum.notifyAll();

}else{try{

printNum.wait();

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

}

}public abstract booleanisShouldPrint();

}packagepracticeagagin;public class EvenTask extendsPrintTask {//子类继承,也要定义下构造方法!

publicEvenTask(PrintNumber printNum) {super(printNum);

}public booleanisShouldPrint(){return printNum.currentNum%2==0;

}

}packagepracticeagagin;public class OddTask extendsPrintTask {publicOddTask(PrintNumber printNum){super(printNum);

}public booleanisShouldPrint(){return printNum.currentNum%2!=0;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值