在学习线程时遇到一个问题
创建了一个类实现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)没有效果?