public class TestStop implements Runnable{
public boolean flag=true;
@Override
public void run() {
int i=0;
while (flag){
System.out.println("run......."+i++);
}
}
public void stop(){
this.flag=false;
}
public static void main(String[] args) {
TestStop ts=new TestStop();
ts.run();
for (int i = 0; i < 1000; i++) {
System.out.println("main"+i++);
if (i==90){
ts.stop();
}
}
}
}
求解答,可能是变量flag的问题,导致一直死循环
运行截图
有几个问题
第一你这不是启动线程的方法,线程需要通过Thread类封装任务类来执行Start()方法,而你执行Run相当于单线程顺序执行,
第二你的遍历连续执行两次i++;永远不会出现90所以变量值不会出现false,也不会使得子线程停止
第三可以在变量加上volatile,保证可见性。
代码重新调整
public class TestStop implements Runnable{
public volatile boolean flag=true; //可见性
@Override
public void run() {
// try {
// TimeUnit.SECONDS.sleep(2);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
int i=0;
while (flag){
System.out.println("run......."+i++);
}
}
public void stop(){
this.flag=false;
}
public static void main(String[] args) {
TestStop ts=new TestStop();
//ts.run(); //这不是启动一个线程而是执行run方法
new Thread(ts).start(); //启动线程
for (int i = 0; i < 1000; i++) {
// System.out.println("main"+i++); //两次 i++,永远不会得到90
System.out.println("main"+i);
if (i==90){
ts.stop();
}
}
}
}
ts.run()
并不是启动子线程,单纯只是在主线程里跑run方法
罢了,所以导致后面的主线程for循环根本没执行,if(i==90)
自然也就没执行。
改成下面这样
public class TestStop implements Runnable{
public volatile boolean flag=true;
@Override
public void run() {
int i=0;
while (flag){
System.out.printf("【%s】:run.......%d \n", Thread.currentThread().getName(), i++);
}
}
public void stop(){
this.flag=false;
}
public static void main(String[] args) {
TestStop ts=new TestStop();
// ts.run();
new Thread(ts).start();
for (int i = 0; i < 200; i++) {
System.out.printf("【%s】:main %d \n", Thread.currentThread().getName(), i);
if (i==90){
ts.stop();
}
}
}
}
你用的是单线程,你的ts.run();这一行,不运行完的话,下面的代码是不会走的,因为你的run方法会一直跑,永远不会结束,你应该在run方法里面去调stop()
你的每个线程都没有加sleep,这导致程序执行的太快了,而且很容易造成线程阻塞
给主线程的循环和子线程的循环都加个sleep再试
Runnable接口实现多线程的方式
实现Runnable接口
重写run方法
创建Thread对象,将刚刚创建好的runnable的子类实现作为thread的构造参数
通过thread.start()进行启动
你这个不是多线程所以会一直循环