public class Multithreading { public static void main(String[] args) 
 {
  Test he=new Test();
  new Thread(he).start() ;
  new Thread(he).start() ;
  new Thread(he).start() ;
  new Thread(he).start() ;
  new Thread(he).start() ;
  new Thread(he).start() ;
  new Thread(he).start() ;
  new Thread(he).start() ;
 
  
 }
}
class Test implements Runnable
{
 int top=1;
 public void run()
 {
  
  while(top>0)
  {
   try{
    Thread.sleep(1);
   }catch(Exception e)
   {}
   System.out.println(Thread.currentThread().getName().toString()+"is running:top="+top--);
  }
 }
}
为什么当top取值为1时,线程按顺序执行,top取其他值时,没有这种现象?

解决方案 »

  1.   

    这是我的测试数据i=100     i=其它值的时候 一样是按顺序执行的 不知道你的结果是什么 拿出来看看
    Thread-0is running:top=100
    Thread-1is running:top=99
    Thread-2is running:top=98
    Thread-3is running:top=97
    Thread-4is running:top=96
    Thread-5is running:top=95
    Thread-6is running:top=94
    Thread-7is running:top=93
    Thread-0is running:top=92
    Thread-1is running:top=91
    Thread-2is running:top=90
    Thread-3is running:top=89
    Thread-4is running:top=88
    Thread-5is running:top=87
    Thread-6is running:top=86
    Thread-7is running:top=85
    Thread-0is running:top=84
    Thread-1is running:top=83
    Thread-2is running:top=82
    Thread-3is running:top=81
    Thread-4is running:top=80
    Thread-5is running:top=79
    Thread-6is running:top=78
    Thread-7is running:top=77
    Thread-0is running:top=76
    Thread-1is running:top=75
    Thread-2is running:top=74
    Thread-3is running:top=73
    Thread-4is running:top=72
    Thread-5is running:top=71
    Thread-6is running:top=70
    Thread-7is running:top=69
    Thread-0is running:top=68
    Thread-1is running:top=67
    Thread-2is running:top=66
    Thread-3is running:top=65
    Thread-4is running:top=64
    Thread-5is running:top=63
    Thread-6is running:top=62
    Thread-7is running:top=61
    Thread-0is running:top=60
    Thread-1is running:top=59
    Thread-2is running:top=58
    Thread-3is running:top=57
    Thread-4is running:top=56
    Thread-5is running:top=55
    Thread-6is running:top=54
    Thread-7is running:top=53
    Thread-0is running:top=52
    Thread-1is running:top=51
    Thread-2is running:top=50
    Thread-3is running:top=49
    Thread-4is running:top=48
    Thread-5is running:top=47
    Thread-6is running:top=46
    Thread-7is running:top=45
    Thread-0is running:top=44
    Thread-1is running:top=43
    Thread-2is running:top=42
    Thread-3is running:top=41
    Thread-4is running:top=40
    Thread-5is running:top=39
    Thread-6is running:top=38
    Thread-7is running:top=37
    Thread-0is running:top=36
    Thread-1is running:top=35
    Thread-2is running:top=34
    Thread-3is running:top=33
    Thread-4is running:top=32
    Thread-5is running:top=31
    Thread-6is running:top=30
    Thread-7is running:top=29
    Thread-0is running:top=28
    Thread-1is running:top=27
    Thread-2is running:top=26
    Thread-3is running:top=25
    Thread-4is running:top=24
    Thread-5is running:top=23
    Thread-6is running:top=22
    Thread-7is running:top=21
    Thread-0is running:top=20
    Thread-1is running:top=19
    Thread-2is running:top=18
    Thread-3is running:top=17
    Thread-4is running:top=16
    Thread-5is running:top=15
    Thread-6is running:top=14
    Thread-7is running:top=13
    Thread-0is running:top=12
    Thread-1is running:top=11
    Thread-2is running:top=10
    Thread-3is running:top=9
    Thread-4is running:top=8
    Thread-5is running:top=7
    Thread-6is running:top=6
    Thread-7is running:top=5
    Thread-0is running:top=4
    Thread-1is running:top=3
    Thread-2is running:top=2
    Thread-3is running:top=1
    Thread-4is running:top=0
    Thread-5is running:top=-1
    Thread-6is running:top=-2
    Thread-7is running:top=-3
    Thread-0is running:top=-4
    Thread-1is running:top=-5
    Thread-2is running:top=-6
      

  2.   

    没有吧 这好象数据破坏的问题,  即使top取大于1的值,也是在按顺序执行啊,只要全部的线程new出来的时间不超过一秒,第一个线程在最后一个线城执行完后返回条件判断继续执行。
      

  3.   

    如果你运行足够多的次数,一样会发现top取值为1时,线程“不”按顺序执行。
    因此,我们不应该假定 线程的执行顺序。Thread-0is running:top=1
    Thread-1is running:top=0
    Thread-3is running:top=-2
    Thread-2is running:top=-1
    请按任意键继续. . .
      

  4.   

    Thread-0is running:top=1
    Thread-1is running:top=0
    Thread-3is running:top=-2
    Thread-4is running:top=-3
    Thread-2is running:top=-1
    请按任意键继续. . .我运行约30次才又出现了一次。大家自己可以试。
      

  5.   

    都是按顺序执行?run again and again and again^
      

  6.   

    shouyenet1(yyhw) 你可否用代码实现的观点呢
      

  7.   

    在多线程的处理循序 和你执行线程的循序是无关的   有关知识可以常看《java虚拟机》
      

  8.   

    bmw219(bmw219) 
    谢了,我会尽快找到那本书
      

  9.   

    你设的临界值太小了,这样JVM执行了第一个Thread的时间很短,程序还没运行到第二个Thread的时候就已经把输出语句打印出来了。
      

  10.   

    这个问题应该从以下几点认识:
    (1)永远不要预测线程执行的顺序,即使指定了优先级时也是如此,但保证运行次数多或运行时间长,线程的运行还是符合一定的规律;
    (2)不要向楼住那样创建线程对象并启动它们,Test he=new Test();
      new Thread(he).start() ;
      new Thread(he).start() ;
      因为这样在执行第一 个new Thread(he).start()时,已经通知虚拟机又有了新的线程加入运行队列,可这样会影响第二个new Thread(he),因为可能在执行构造函数的过程中已经start()的那个线程会插入执行,依次类推,到最好一个线程的对象还没有创建好时,前面的几个线程都已经运行好久了,这样与预期的结果有所不同是正常的;
      

  11.   

    没用临界区
    线程的调用顺序
    是不可重现的
    如果你现在CPU很闲的话是 
    来一个处理一个
    看起来是 顺序
    如果很忙的话就要看操作系统的调度算法
    天知道是什么顺序是静安寺不是道明寺,是源程序不是言承旭;是在静安寺写源程序,不是在流星花园看F4。
      

  12.   

    同意 RedrainX(千行泪)  的话 
    去预测 线程运行执行顺序 是个 没意义 的事情
    如果有特殊需要的话用临界区 同步吧是静安寺不是道明寺,是源程序不是言承旭;是在静安寺写源程序,不是在流星花园看F4。