cregithar 2020-11-25 19:58 采纳率: 88.2%
浏览 12
已采纳

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)没有效果?

  • 写回答

2条回答

      报告相同问题?

      相关推荐 更多相似问题

      悬赏问题

      • ¥20 大学计算机网络实验报告
      • ¥20 Oracle触发器,用户管理题目
      • ¥250 python的exchangelib 报错
      • ¥15 Oracle外部过程获取的句柄属性为空
      • ¥20 snmpv3相关提问
      • ¥20 boost电路升压频率和占空比选择
      • ¥15 找个人工智能的大佬咨询一些毕设问题
      • ¥15 需要教程:GD32F450I移植无系统lwip
      • ¥15 中文语料库检索构式 求助
      • ¥15 关于naver点击量信息