请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

有时候会出现打印线程结束之后很长时间以后,程序才真正结束

用volatile设置boolean的canceled看似能够停止线程 代码中:

package threadcoreknowledge.stopthreads.volatiledemo;

/**
 * 描述:     演示用volatile的局限:part1 看似可行
 */
public class WrongWayVolatile implements Runnable {

    private volatile boolean canceled = false;

    @Override
    public void run() {
        int num = 0;
        try {
            while (num <= 100000 && !canceled) {
                if (num % 100 == 0) {
                    System.out.println(num + "是100的倍数。");
                }
                num++;
                Thread.sleep(1);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        WrongWayVolatile r = new WrongWayVolatile();
        Thread thread = new Thread(r);
        thread.start();
        Thread.sleep(5000);
        r.canceled = true;
    }
}

r.canceled = true; 执行结束之后,就会停止打印100的倍数,idea 控制台输出:


4200是100的倍数。
4300是100的倍数。
Process finished with exit code 0

但是过了很久很久,主线程才结束,远远超过了主线程设置的5秒。
这时候主线程还有打印线程不是应该都结束了吗?请问老师这是怎么回事呢?
que

正在回答 回答被采纳积分+3

1回答

悟空 2022-04-18 22:59:43

我执行了你的代码,5秒后立刻就停止了

1 回复 有任何疑惑可以回复我~
  • 提问者 imheyan #1
    老师辛苦啦,但是您的代码有时候5秒左右能结束,但更多时候要十几秒甚至更长,您可以多试几次
    回复 有任何疑惑可以回复我~ 2022-04-18 23:10:58
  • 悟空 回复 提问者 imheyan #2
    我试了二十几次,都是按时停止了,可能是不同电脑效果不一样。你在主线程结束前打印个语句,打印一下执行时长,再debug看下。
    回复 有任何疑惑可以回复我~ 2022-04-19 10:26:20
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信