用Java 如何在for循环中创建线程并输出合适结果
staticinti;for(i=0;i<3;i++){newThread(){publicvoidrun(){System.out.println(i);}}.star...
static int i;
for(i=0; i<3; i++){
new Thread(){
public void run(){
System.out.println(i);
}
}.start();
}
结果为3 3 3,这是为什么
想得到结果为0 1 2该怎么做 展开
for(i=0; i<3; i++){
new Thread(){
public void run(){
System.out.println(i);
}
}.start();
}
结果为3 3 3,这是为什么
想得到结果为0 1 2该怎么做 展开
4个回答
展开全部
其实你说的3 3 3 应该都不是正确的!!!
你这个主要是看执行绪的结果,
所以你应该可以试试看跑个几百次应该答案会有更多种,
这个就是执行绪配置问题,
而为何後面要你加上
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO 自动产生的 catch 区块
e.printStackTrace();
}
就是要你等待一下,这样时间配置上才会有可能同部,当然如果你觉得这样的问题还不够完美,
你可以使用 synchronized(test.class) 这个方式来撰写!!!
你这个主要是看执行绪的结果,
所以你应该可以试试看跑个几百次应该答案会有更多种,
这个就是执行绪配置问题,
而为何後面要你加上
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO 自动产生的 catch 区块
e.printStackTrace();
}
就是要你等待一下,这样时间配置上才会有可能同部,当然如果你觉得这样的问题还不够完美,
你可以使用 synchronized(test.class) 这个方式来撰写!!!
追问
在这里输出应该是比较单一的,因为只进行了3次循环,如果把循环次数加大会有不同的结果,不过这都不要紧。你能否具体一点地解释一下如何用synchronized(.class)的方式编码呢?
追答
我先和你解释一下synchronized好了,
synchronized 就是资源锁定 就是一次只有一个执行绪可以使用,下一个执行绪需要使用需要等待。
你现在这个问题是,我要列印的时候但是回圈已经做好++的做动了!!!
这个就是一般我们术语说的【竞速】状况,
你现在要解决的就是这个问题,
要让他们会排队,就是排队不要看错喔!!!
执行绪一般是不会去排队的,一般是先抢先赢啦!!!
我简单打一个给你看看好了!!
补充一下:
这里面有两个线程:
for 一个
new 一个
这里需要做的是两个线程需要互相等待对方才能够执行下一步,
以这样个构思应该可以解决这个近乎无解的题目呀= ="
只是我怕解完可能是不知道要打多少程式码= ="
展开全部
添加一个sleep语句,添加位置在start之后
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
线程的同步与互斥,百度搜博客,会有大量的介绍,比知道更详细
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
为什么用static 声明这个i?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询