返回信息流public class ThreadTest2
{
public static void main(String[] args)
{
Thread3 r1 = new Thread3();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r1);
t1.start();
t2.start();
}
}
class Thread3 implements Runnable
{
int i;
@Override
public void run()
{
while(true)
{
try
{
// System.out.println(i++);
Thread.sleep((long)(Math.random()*1000));
System.out.println(i++);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(20 == i)
{
break;
}
}
}
}
为什么输出放在Thread.sleep()后会出现死循环,放在前面就没影响呢
这是一条镜像帖。来源:北邮人论坛 / java / #48430同步于 2016/3/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
求助一题
ljq661
2016/3/12镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
Thread-0-19
Thread-1-20
Thread0 打印了19之后,把i变成了20,自己的while结束,
Thread1 拿到了i=20,并打印,然后把i变成了21,绕过了break。
至于说为什么sleep之前打印就没事,还得看暖神怎么说
应该跟Thread.sleep((long)(Math.random()*1000));有关系;
放在前面 出现死循环的概率小吧。
如果改成Thread.sleep(1000);输出放在Thread.sleep()前后都会随机出现死循环;
i是共享资源,所以多线程并发访问同一个对象造成的。
如有误导请谅解。
【 在 june0334 的大作中提到: 】
: Thread-0-19
: Thread-1-20
: Thread0 打印了19之后,把i变成了20,自己的while结束,
: ...................
多谢讲解
【 在 xushu 的大作中提到: 】
: 应该跟Thread.sleep((long)(Math.random()*1000));有关系;
: 放在前面 出现死循环的概率小吧。
: 如果改成Thread.sleep(1000);输出放在Thread.sleep()前后都会随机出现死循环;
: ...................
谢谢
【 在 nuanyangyang 的大作中提到: 】
: 两个线程同时读写共享的变量i,而没有任何同步,这是data race,有可能会发生很多匪夷所思的事情。不要这样做。
多谢暖神