线程笔试题:不明白为什么会输出pingpong而不是pongping

发布于 2022-09-11 17:58:00 字数 455 浏览 18 评论 0

下面的代码输出pingpong,我不太明白为什么这个 System.out.print 会在 t.start之前输出
我的想法是 应该会随机输出 pongping和pingpong,应该没有顺序的才对呀。。

public class Test2 {

    public static void main(String args[]) {

        Thread t = new Thread() {

            public void run() {
                pong();
            }
        };

        t.start();
        System.out.print("ping");

    }

    static void pong() {

        System.out.print("pong");

    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

最舍不得你 2022-09-18 17:58:00

两个线程不在同一起跑线上,主线程都已经跑到System.out.print("ping");这一行了,t线程才刚刚开始,t线程总要经过一些准备吧,在多核CPU上,主线程大概率会先获得System.out对象,然后先输出ping。得想办法让两个线程站在统一起跑线上。

public static void main(String args[]) throws InterruptedException {
    CountDownLatch latch = new CountDownLatch(1);
    Thread t = new Thread() {
        public void run() {
            latch.countDown();
            System.out.print("pong");
        }
    };
    t.start();
    latch.await();//等一下线程t
    System.out.print("ping");
}

//输出
pingpong
pingpong
pingpong
pongping
pingpong
梦在深巷 2022-09-18 17:58:00

主线程和线程t是并发执行的,无法确定谁先执行。因此输出pingpong或pongping都是可能的。

楠木可依 2022-09-18 17:58:00

得看到谁先拿到话事权,毕竟主线程和子线程是并发执行的,你多执行几次,就会发现,会出现很多奇奇怪怪的情况,如果你再子线程里面做个休眠等待,那么就不会出现pongping的现象了

盗心人 2022-09-18 17:58:00

这个应该就是会随机输出pongping和pingpong的。

め七分饶幸 2022-09-18 17:58:00

Thread.start() 只是设定新线程进入 “就绪” 状态,等待 CPU 调度之后才会执行。
而下一个 System.out.print() 几乎(概率大于99%)可以认为是立即接着执行的。
所以,最终效果就是,几乎都是 pingpong。

CPU 执行一条指令的时间,几乎可以忽略,基本是微秒级左右。
CPU 调度切换的时间间隔,基本在毫秒级以上。
这两个时间的比值跟环境有关,但是明显是相当大的(不可能在切换上,消耗太多时间,浪费资源)。

不同的 JAVA 版本,虚拟机,配置,可能效果不一定(编译优化、指令乱序、垃圾回收等等问题)。
但是,主线程的下一条指令,比新线程的第一条指令要快,基本是可以确定的。
没有什么 “随机” 一说。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文