关于java线程的困惑(第一次发帖,不知道有人看没)

今天读了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()交互出现。

求高手指导。。。。。。。。。。。。。。。

 

你可能感兴趣的:(java,package,private,public,的)