为了账号安全,请及时绑定邮箱和手机立即绑定

new了2个Thread,为什么不是交叉打印?

new了2个Thread,为什么不是交叉打印?

小唯快跑啊 2019-02-21 11:57:32
public static void main(String[] args){ new Thread(new Runnable() { @Override public void run() { for (int i=0; i<10; i++){ System.out.print(i+" "); } } }).start(); new Thread(new Runnable() { @Override public void run() { for (int i=0; i<10; i++){ System.out.print(i+" "); } } }).start(); } 输出结果如下: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
查看完整描述

13 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

cpu的执行速度太快,数字太小看不出差距.要是我,起码Integer.MaxValue.

查看完整回答
反对 回复 2019-03-01
?
当年话下

TA贡献1890条经验 获得超9个赞

如果没有同步锁,这两个线程是不会出现你说的交叉打印的,线程的执行的优先级在于谁先获取了cpu资源,你的程序并不能保证哪个线程先执行。再好好看看java多线程知识吧。

查看完整回答
反对 回复 2019-03-01
?
慕森王

TA贡献1777条经验 获得超3个赞

设置的次数太少,如果你设置100个数就能看到俩个线程交叉(这里的交叉不是线程1打印一个数,线程2马上打印一个数,而是一段一段的)打印的效果;cpu抢到资源就执行了。你要实现交叉打印的话,那是个生产这与消费者的例子。

查看完整回答
反对 回复 2019-03-01
?
POPMUISE

TA贡献1765条经验 获得超5个赞

就输出完10个数字太快了,把10改成100试试。

查看完整回答
反对 回复 2019-03-01
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

加上个线程休眠时间

查看完整回答
反对 回复 2019-03-01
?
米脂

TA贡献1836条经验 获得超3个赞

0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 我的是这样的!自己想吧

查看完整回答
反对 回复 2019-03-01
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

线程是不保证执行顺序的。

查看完整回答
反对 回复 2019-03-01
?
慕神8447489

TA贡献1780条经验 获得超1个赞

线程的执行顺序是不确定的,谁抢占到cpu谁就执行,十个数字的顺序也不一定是你这样的,你多执行几次就会出现不同的结果。而且线程的优先级也无法保障线程的执行次序。只不过优先级高的线程获取 CPU 资源的概率大一点而已。

查看完整回答
反对 回复 2019-03-01
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

1、控制使得线程锁的顺序保持一致,可以使用java.util.concurrent.locks包里灵活的锁
2、使用java.util.concurrent.atomic包的原子类

查看完整回答
反对 回复 2019-03-01
?
呼唤远方

TA贡献1856条经验 获得超11个赞

CPU的执行太快了,第一个线程很快就执行完了,第二个线程估计还没有创建好,把循环的值改到1000试试,应该就能看出来效果了但肯定不会是交叉的,是混乱的

查看完整回答
反对 回复 2019-03-01
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

CPU执行任务是乱序执行,不保证多线程之间的同步,如果要保证顺序,需要做同步控制

查看完整回答
反对 回复 2019-03-01
  • 13 回答
  • 0 关注
  • 785 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信