class  AB
{
public static void main(String[] args) 
{
  A s=new A();
  Thread t1=new Thread(s);
           Thread t2=new Thread(s);
           Thread t3=new Thread(s);
           Thread t4=new Thread(s);
  t1.start();
           t2.start();
           t3.start();
           t4.start();
}
}
class A implements Runnable
{
private int tick=100;
public void run()
{
while(true)
{
if(tick>0)
{//try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"......."+tick--);
}
}
}
}

解决方案 »

  1.   

    楼主多线程的程序都写出来了不会还不了解线程的概念吧,无序才能说明cpu时间调度的随机性
      

  2.   

    我并不是说cpu时间的调度 我所说的是程序打印tick--时 我想结果应该是100 99 98  97 ....顺序递减但实际运行确是无序的比如:100 99 97 96 98 95.......
      

  3.   

    两个线程a,b
    tick假设是90a中tick--,该打印90,tick变成89,还没有打印90,OK,此时cpu切换线程执行b开始执行,tick--,该打印89,tick变成88,此时b时间片可能分的多一点又或者b运行的快一点,b线程打印出了89,OK,此时线程再切换a开始执行,上次a还留了个90没打印,此时打印90
    于是就出现了89在前,90在后的现象
      

  4.   

     楼主,我给你举个例子哈,你在火车站买票,总共有5个窗口,在第一个买地100张票,第99张票就必须让第二个窗口卖么?因为上面的几个线程的优先级都是一样的,所以谁先抢占到cpu谁就先执行输出,他们只要把票卖完就阿了啊!如果你不加上同步代码块在你输出的时候(加上延时就更明显了)就会有负值出现,想必这个你应该明白,如果你加上了同步代码块那么上面的线程就只有第一个是起作用的。下面是代码:
    不加同步快:public class AB {
    public static void main(String[] args) {
    A s = new A();
    Thread t1 = new Thread(s,"售票口->>1");
    Thread t2 = new Thread(s,"售票口->>2");
    Thread t3 = new Thread(s,"售票口->>3");
    Thread t4 = new Thread(s,"售票口->>4");
    t1.start();
    t2.start();
    t3.start();
    t4.start();
    }
    }class A implements Runnable {
    private int tick = 10; public void run() {

    for(int i = 0;i<100;i++){
    if (tick > 0) {
    try{
    Thread.sleep(100);
    }catch(Exception e){
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + "......."
    + tick--);
    }
    }
    }
    }
    输出:售票口->>4.......10
    售票口->>2.......9
    售票口->>1.......8
    售票口->>3.......7
    售票口->>4.......6
    售票口->>1.......5
    售票口->>3.......4
    售票口->>2.......3
    售票口->>4.......2
    售票口->>2.......1
    售票口->>3.......0
    售票口->>1.......-1
    售票口->>4.......-2
    加上同步代码块:
    package study;public class AB {
    public static void main(String[] args) {
    A s = new A();
    Thread t1 = new Thread(s,"售票口->>1");
    Thread t2 = new Thread(s,"售票口->>2");
    Thread t3 = new Thread(s,"售票口->>3");
    Thread t4 = new Thread(s,"售票口->>4");
    t1.start();
    t2.start();
    t3.start();
    t4.start();
    }
    }class A implements Runnable {
    private int tick = 10; public void run() {
    synchronized (this) {
    for(int i = 0;i<100;i++){
    if (tick > 0) {
    try{
    Thread.sleep(100);
    }catch(Exception e){
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + "......."
    + tick--);
    }
    }
    }
    }
    }
    输出结果:
    售票口->>1.......10
    售票口->>1.......9
    售票口->>1.......8
    售票口->>1.......7
    售票口->>1.......6
    售票口->>1.......5
    售票口->>1.......4
    售票口->>1.......3
    售票口->>1.......2
    售票口->>1.......1
    这下楼主应该明白了吧
      

  5.   

    不过System.out.println(Thread.currentThread().getName() + "......." + tick--);里
    不是先打印tick 在执行减减吗,怎么可能出现三楼所说的"tick变成89,还没有打印90"这种情况呢 ??