多线程Thread例子的 疑问

Amerson 2008-03-03 09:04:52
小弟今天看了篇关于多线程的文章, 按照文中的例子编写测试运行了下程序,对运行的结果有点疑问,
请各位说说看,为什么在
“创建第【4】个线程!”之后 “线程[3] is running, 线程总数count=1 ” 这里 总数count怎么还等于1呢?前面count的最大值已经累加到等于3了!! count 的值似乎没有什么规律啊,我觉得应该是递增的才对啊


-------------------运行结果如下---------------------------
D:\java\test\thread>java MyThread
创建第【1】个线程!
创建第【2】个线程!
线程[1] is running, 线程总数count=1
创建第【3】个线程!
线程[1] is running, 线程总数count=2
线程[2] is running, 线程总数count=1
创建第【4】个线程!
线程[1] is running, 线程总数count=3
线程[3] is running, 线程总数count=1
线程[2] is running, 线程总数count=2
创建第【5】个线程!
线程[1] is running, 线程总数count=4
线程[4] is running, 线程总数count=1
线程[3] is running, 线程总数count=2
线程[2] is running, 线程总数count=3
线程[1] is running, 线程总数count=5
线程[5] is running, 线程总数count=1
线程[4] is running, 线程总数count=2
线程[3] is running, 线程总数count=3
线程[2] is running, 线程总数count=4
线程[5] is running, 线程总数count=2
线程[4] is running, 线程总数count=3
线程[3] is running, 线程总数count=4
线程[2] is running, 线程总数count=5
线程[5] is running, 线程总数count=3
线程[4] is running, 线程总数count=4
线程[3] is running, 线程总数count=5
线程[5] is running, 线程总数count=4
线程[4] is running, 线程总数count=5
线程[5] is running, 线程总数count=5
---------------------------------------------------

-----------------------原程序如下----------------------------

import java.lang.Thread;
public class MyThread extends Thread
{
int num, count=1;

public MyThread(int i){
System.out.println(" 创建第【"+i+"】个线程!");
num = i ;
}

public void run(){
while(true){
System.out.println("线程["+num+"] is running, 线程总数count="+count);
if(++count==6)
return;
}
}

public static void main(String[] args)
{
for(int j=0; j<5; j++){
new MyThread(j+1).start();
}
}
}




...全文
482 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
changjiangzhibin 2008-03-04
  • 打赏
  • 举报
回复
结果是正确的呀,LZ想的与代码实现没衔接好
Amerson 2008-03-04
  • 打赏
  • 举报
回复
多谢楼上各位兄弟的指点!! 让我豁然开朗啊!

小弟明白了: 每new 一个Thread , 也就会产生这个thread的成员变量num , count;
产生的5个thread实例,都有自己的num,count。
当JVC分派到某个线程run的时候, 只会改变本线程的count值。


ooo19841080xinxin 2008-03-03
  • 打赏
  • 举报
回复
count 属于成员变量,new 一个对象就拥有一个count
huoyin 2008-03-03
  • 打赏
  • 举报
回复
因为你的程序会生成5个MyThread对象,而每个MyThread对象有各自的count变量,所以count只是累计该对象的运行次数。
qingyuan18 2008-03-03
  • 打赏
  • 举报
回复
楼主你如果想进行线程调度的话,建议用一个常量类,然后设置全局变量来设置线程的个数,每个线程创建时更新这个常量类的全局变量

public class SysComm{
public static int iThreadCount =0;
}

public static void main(String[] args)
{
for(int j=0; j<5; j++){
new MyThread(j+1).start();
SysComm.iTreadCount++;
}
}
Fenglee2008 2008-03-03
  • 打赏
  • 举报
回复
你这个count不是各个线程公用的数据,所以count并不是你创建的线程的个数!
frilly 2008-03-03
  • 打赏
  • 举报
回复
线程的执行并没有规律的,继承Thread类的线程,都是有自己的类变量的,
也就是说,第一个创建的线程都有自己的count变量,
如果实现的是Runable接口的类,则类的所有实例都会共享一个类变量,
才会出现你想象的那中情况!

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧