java线程问题。。

在学习线程时遇到一个问题  
创建了一个类实现Runnable接口   

public class testRun implements Runnable{
    //线程停止标志位
    private volatile boolean cancelled = false;
    
    public void run(){
        int i = 1;
        
        //线程没停止时一直输出这句话
        while(!cancelled){
            System.out.println(i);
            i++;
        }
        
        System.out.println("线程结束后总该说点什么...");
    }
    
    //提供一个public的停止方法
    public void cancell(){
        System.err.println("线程结束");
        cancelled = true;
    }

}

测试类
 

//测试
public class test {
    
    public static void main(String[] args) {
        testRun run = new testRun();
        Thread t = new Thread(run);
        t.start();
        
        //这个是调用停止方法,这里不用就先放着先
    //  run.cancell();
    }

}

结果很奇怪,输出数字,但数字不是从1开始的,而是从很大的数开始的,并且每次的初始数都不一样,如图



第一个问题:为什么会出现这种情况?


接下来我尝试改一下run方法 
然后便发现在run方法的循环中加一个Thread.sleep()可以解决这个问题,不太懂。看代码

//修改后
public class testRun implements Runnable{
    //线程停止标志位
    private volatile boolean cancelled = false;
    
    public void run(){
        int i = 1;
        
        while(!cancelled){
            //没停止时一直输出这句话
            System.out.println(i);
            i++;
            
            //在循环里加入Thread.sleep
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
        }
        
        System.out.println("线程结束后总该说点什么...");
    }
    
    //提供一个public的停止方法
    public void cancell(){
        System.err.println("线程结束");
        cancelled = true;
    }

}


 

问题二:为什么加入Thread.sleep()可以解决这个问题?

 

发现sleep可以解决这个问题后,我试了试Thread.sleep(0),发现不行。。。


public class testRun implements Runnable{
    //线程停止标志位
    private volatile boolean cancelled = false;
    
    public void run(){
        int i = 1;
        
        while(!cancelled){
            //没停止时一直输出这句话
            System.out.println(i);
            i++;
            
            //sleep(0)不行,和没加一样
            try {
                Thread.sleep(0);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        System.out.println("好吧我是傻瓜....");
    }
    
    //提供一个public的停止方法
    public void cancell(){
        System.err.println("线程结束");
        cancelled = true;
    }

}


问题三:为什么加入Thread.sleep(0)没有效果?

查看全部
weixin_41570207
cregithar
2020/11/25 19:58
  • java
  • 点赞
  • 收藏
  • 回答
    私信
满意答案
查看全部

2个回复