家装设计网站怎么做,保定网站制作策划,asp网站设计要求,建设部监理工程师网站在该示例代码中#xff0c;TestAccount类是测试类#xff0c;主要实现创建帐户Account类的对象#xff0c;以及启动学生线程StudentThread和启动家长线程GenearchThread。在StudentThread线程中#xff0c;执行的功能是每隔2秒中取一次钱#xff0c;每次取50元。在Genearc…在该示例代码中TestAccount类是测试类主要实现创建帐户Account类的对象以及启动学生线程StudentThread和启动家长线程GenearchThread。在StudentThread线程中执行的功能是每隔2秒中取一次钱每次取50元。在GenearchThread线程中执行的功能是每隔12秒存一次钱每次存200。这样存款和取款之间不仅时间间隔存在差异而且数量上也会出现交叉。而该示例中最核心的代码是Account类的实现。在Account类中实现了同步控制功能在该类中包含一个关键的属性money该属性的作用是存储帐户金额。在介绍该类的实现前首先介绍一下两个同步方法——wait和notify方法的使用这两个方法都是Object类中的方法也就是说每个类都包含这两个方法换句话说就是Java天生就支持同步处理。这两个方法都只能在synchronized修饰的方法或语句块内部采用被调用。其中wait方法的作用是使调用该方法的线程休眠也就是使该线程退出CPU的等待队列处于冬眠状态不执行动作也不占用CPU排队的时间notify方法的作用是唤醒一个任意该对象的线程该线程当前处于休眠状态至于唤醒的具体是那个则不保证。在Account类中被StudentThread调用的getMoney方法的功能是判断当前金额是否是0如果是则使StudentThread线程处于休眠状态如果金额不是0则取出50元同时唤醒使用该帐户对象的其它一个线程而被GenearchThread线程调用的saveMoney方法的功能是判断当前是否不为0如果是则使GenearchThread线程处于休眠状态如果金额是0则存入200元同时唤醒使用该帐户对象的其它一个线程。如果还是不清楚那就结合前面的程序执行结果来解释一下程序执行的过程在程序开始执行时学生线程和家长线程都启动起来所以输出“准备取钱”和“准备存钱”然后学生线程按照该线程run方法的逻辑执行先延迟2秒然后调用帐户对象a中的getMoney方法但是由于初始情况下帐户对象a中的money数值为0所以学生线程就休眠了。在学生线程执行的同时家长线程也按照该线程的run方法的逻辑执行先延迟12秒然后调用帐户对象a中的saveMoney方法由于帐户a对象中的money为零条件不成立所以执行存入200元同时唤醒线程由于使用对象a的线程现在只有学生线程所以学生线程被唤醒开始执行逻辑取出50元然后唤醒线程由于当前没有线程处于休眠状态所以没有线程被唤醒。同时家长线程继续执行先延迟12秒这个时候学生线程执行了4次耗时4X2秒8秒就取光了帐户中的钱接着由于帐户为0则学生线程又休眠了一直到家长线程延迟12秒结束以后判断帐户为0又存入了200元程序继续执行下去。在解决多线程问题是互斥和同步都是解决问题的思路如果需要形象的比较这两种方式的区别的话就看一下下面的示例。一个比较忙的老总桌子上有2部电话在一部处于通话状态时另一部响了老总拿其这部电话说我在接电话你等一下而没有挂电话这种处理的方式就是互斥。而如果老总拿其另一部电话说我在接电话等会我打给你然后挂了电话这种处理的方式就是同步。两者相比互斥明显占用系统资源(浪费电话费浪费别人的时间)而同步则是一种更加好的解决问题的思路。