当前页面: 开发资料首页 → 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
这样的结果呢?