今天读了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()交互出现。
求高手指导。。。。。。。。。。。。。。。