线程笔试题:不明白为什么会输出pingpong而不是pongping
下面的代码输出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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
两个线程不在同一起跑线上,主线程都已经跑到
System.out.print("ping");
这一行了,t线程才刚刚开始,t线程总要经过一些准备吧,在多核CPU上,主线程大概率会先获得System.out
对象,然后先输出ping
。得想办法让两个线程站在统一起跑线上。主线程和线程t是并发执行的,无法确定谁先执行。因此输出pingpong或pongping都是可能的。
得看到谁先拿到话事权,毕竟主线程和子线程是并发执行的,你多执行几次,就会发现,会出现很多奇奇怪怪的情况,如果你再子线程里面做个休眠等待,那么就不会出现pongping的现象了
这个应该就是会随机输出pongping和pingpong的。
Thread.start() 只是设定新线程进入 “就绪” 状态,等待 CPU 调度之后才会执行。
而下一个 System.out.print() 几乎(概率大于99%)可以认为是立即接着执行的。
所以,最终效果就是,几乎都是 pingpong。
CPU 执行一条指令的时间,几乎可以忽略,基本是微秒级左右。
CPU 调度切换的时间间隔,基本在毫秒级以上。
这两个时间的比值跟环境有关,但是明显是相当大的(不可能在切换上,消耗太多时间,浪费资源)。
不同的 JAVA 版本,虚拟机,配置,可能效果不一定(编译优化、指令乱序、垃圾回收等等问题)。
但是,主线程的下一条指令,比新线程的第一条指令要快,基本是可以确定的。
没有什么 “随机” 一说。