站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题初学线程,简单的计数程序,帮忙看看

初学线程,简单的计数程序,帮忙看看

摘要: 初学线程,简单的计数程序,帮忙看看


类似计数器的小程序:

public class Test1 extends Thread{
static int count = 0;
int number;
public Test1(int num){
number = num;
}
public void run(){
while(count<30){
//synchronized(this){
count++;
//}
System.out.println ("线程"+number+":"+count);
}
}

public static void main(String[] args){
for(int i=0; i<3;i++)
new Test1(i).start();
}
}

本意是想让它依次打出1-30

按资料上的方法加了锁,但并不能实现我想要的功能

请问应该怎么弄呢?


晕,大家来帮忙看看


说清楚你的问题, 你是想要什么样的结果?

**** http://www.bjsxt.com ****
**** 北京尚学堂科技java培训 , 为大家服务 , 顺便做点广告 , 请见谅! ****


我的本意是想让它按顺序输出
1-30


让谁? count?
现在count是按顺序输出的呀?

**** http://www.bjsxt.com ****
**** 北京尚学堂科技java培训 , 为大家服务 , 顺便做点广告 , 请见谅! ****


你是不是想让他在同一个线程中按顺序输出?

**** http://www.bjsxt.com ****
**** 北京尚学堂科技java培训 , 为大家服务 , 顺便做点广告 , 请见谅! ****


不是,不信你试试
如果你可以的话,再把count改大点,就会发现的

我这里是18或17会输到最后去的

线程2:29
线程2:30
线程1:18


我的意思呢,是这样

三个线程,按访问的顺序打出count

比如,线程1访问时,coun=18,这时就先打出18,接下来是其它线程访问,使count=19,然后打出


我想要的结果
打出的顺序应该为:
线程i:1
线程i:2
线程i:3
..
线程i:30
即不管线程怎么样,但后面的count一定要按顺序



这是因为在count递增的过程中被打断的原因
你这样改

synchronized(this)

{
count++;
System.out.println(.....); //把打印的语句也加入到synchronized中!
}

**** http://www.bjsxt.com ****
**** 北京尚学堂科技java培训 , 为大家服务 , 顺便做点广告 , 请见谅! ****


你所说的我也试过

但打出的也不行
截它打出的开头的和结尾的给你看看

线程0:3
线程0:4
线程0:5
。。
线程1:29
线程1:30
线程2:18

开头没有1,2
中间也没按顺序来


我甚至把整个while循环加到也还是 不行

反而把开头的1,2也不能输出了


知道了, 你再试试下面

sychronized (this)
{
while(cout < 30) {
.....
}
}
把while循环也加进去!

**** http://www.bjsxt.com ****
**** 北京尚学堂科技java培训 , 为大家服务 , 顺便做点广告 , 请见谅! ****


还有一个办法:

public class Test1 extends Thread{
static Integer count = new Integer(0);
int number;
public Test1(int num){
number = num;
}
public void run(){
synchronized (count) {
while(count.intValue()<300){
count = new Integer(count.intValue() + 1);
System.out.println ("线程"+number+":"+count);
}
}

}

public static void main(String[] args){
for(int i=0; i<3;i++)
new Test1(i).start();
}
}

**** http://www.bjsxt.com ****
**** 北京尚学堂科技java培训 , 为大家服务 , 顺便做点广告 , 请见谅! ****


汗,还是不行
你的代码,我按30来,最后输出的几个为:

线程2:27
线程2:28
线程2:29
线程2:30
线程1:18

前面的1,2可以输出了


按300来是这样

线程2:296
线程2:297
线程2:298
线程2:299
线程2:300
线程1:259
线程0:283


我这儿一点儿问题没有, 偷偷的问:
你改的和你运行的是同一个程序吗?

**** http://www.bjsxt.com ****
**** 北京尚学堂科技java培训 , 为大家服务 , 顺便做点广告 , 请见谅! ****


绝对是

不过我用的是JDK6.0的

我想不会是这个问题吧,我试试别的JDK


你的this变量根本锁不住三个线程对静态变量count的访问,静态变量属于类变量。
synchronized(this)可改为synchronized(Test1.class)锁住类对象。另外对静态变量count的判断和自增应该放在一个同步语句中,否则当同步语句时间花费比较多的情况下,会出现错误。
while(true){
synchronized(Test1.class){
if(count<30){
count++;
System.out.println (“Thread"+number+count);
}else return;
}
}



我用的是5.0 , 没看到有任何问题, 请其他老大们也试试吧

**** http://www.bjsxt.com ****
**** 北京尚学堂科技java培训 , 为大家服务 , 顺便做点广告 , 请见谅! ****


跑了一下,没有出现你说的情况。
结果是:
线程0:1
线程0:2
线程0:3
线程0:4
线程0:5
线程0:6
线程0:7
线程0:8
线程0:9
线程0:10
线程0:11
线程0:12
线程0:13
线程0:14
线程0:15
线程0:16
线程0:17
线程0:18
线程0:19
线程0:20
线程0:21
线程0:22
线程0:23
线程0:24
线程0:25
线程0:26
线程0:27
线程0:28
线程0:29
线程0:30

线程0先被执行,它没有暂停的理由,
所以一直执行,其它线程根本没执行的机会。



fuyang_ywf
的方法可以,我怀疑是JDK的问题,先吃饭去了

等下回来我继续试试,有什么问题继续请求大家


确实是JDK的问题

我用我最初的程序
只锁住了
count++;这句

实现完全正常,数字大到300也一样
看来我以后不能用JDK6了

谢谢大家了


如何利用网络---大讨论,欢迎朋友加入,msn:group7813@xiaoi.com


我想问一下 如何才能打印出:
thread 0 1
....
thread 0 30
thread 1 1
....
thread 1 30
thread 2 1
....
thread 2 30

这样的结果呢?


↑返回目录
前一篇: 急!在JSP文件中,怎么能向一个文本文件追加内容?
后一篇: 请问这一句是什么意思呀