今天读了Java Thread Programming,其中的一个例子让我很费解:
package com.luffy.demo3;
public class AlternateSuspendResume implements Runnable { private volatile int firstVal; private volatile int secondVal; //add private volatile boolean suspended; public boolean areValuesEqual(){ return (this.firstVal == this.secondVal); } @Override public void run() { // TODO Auto-generated method stub try { this.suspended = false; this.firstVal = 0; this.secondVal = 0; workMethod(); } catch (Exception e) { // TODO: handle exception System.out.println("interrupted while in workMethod();"); } } private void workMethod() throws InterruptedException { // TODO Auto-generated method stub int val = 1; while(true){ this.waitWhileSuspend(); System.out.println("...."); this.stepOne(val); this.stepTwo(val); val++; this.waitWhileSuspend(); Thread.sleep(200); } } private void waitWhileSuspend() throws InterruptedException{ // TODO Auto-generated method stub while(this.suspended){ System.out.println("没有resume..."); Thread.sleep(200); } // System.out.println("....."); } private void stepOne(int val) throws InterruptedException { // TODO Auto-generated method stub this.firstVal = val; Thread.sleep(300); } private void stepTwo(int val) { // TODO Auto-generated method stub this.secondVal = val; } public void suspendRequest(){ this.suspended = true; } public void resumeRequest(){ this.suspended = false; } public static void main(String[] args) { AlternateSuspendResume asr = new AlternateSuspendResume(); Thread t = new Thread(asr); t.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for( int i=0;i<5;i++){ asr.suspendRequest(); try { Thread.sleep(350); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("dsr.areValuesEqual()="+asr.areValuesEqual()); asr.resumeRequest(); try { Thread.sleep((long)(Math.random()*2000.0)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.exit(0); } }把main方法里的asr.resumeRequest();暂时注掉。如果我在workMethod()里第一个this.waitWhileSuspend();调用结束后添加测试语句“第一次后....”,waitWhileSuspend()方法里的while循环里面添加测试语句“没有resume...”,在while循环后面添加测试语句“.....”,打印结果如下:
.....
第一次后.... ..... ..... 第一次后.... ..... 没有resume... 没有resume... dsr.areValuesEqual()=true 没有resume... 没有resume... 没有resume... 没有resume... dsr.areValuesEqual()=true 没有resume... 没有resume... 没有resume... 没有resume... 没有resume... 没有resume... 没有resume... 没有resume... 没有resume... dsr.areValuesEqual()=true 没有resume... 没有resume... 没有resume... 没有resume... 没有resume... 没有resume... 没有resume... 没有resume... 没有resume... dsr.areValuesEqual()=true 没有resume... 没有resume... 没有resume... 没有resume... dsr.areValuesEqual()=true 没有resume... 没有resume... 没有resume... 没有resume... 没有resume... 没有resume...
我所不明白的是为什么前6个怎么会出现那么多次,我想应该各出现一次才对啊,应该是
.....
第一次后....然后就是没有resume...和dsr.areValuesEqual()交互出现。
求高手指导。。。。。。。。。。。。。。。