class MultiThread
{
public static void main(String[] args)
{
MyThread mt = new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
while (true)
{
System.out.println("main : " + Thread.currentThread().getName());
}
}
}class MyThread implements Runnable
{
int index = 0;
public void run()
{
while (true)
{
System.out.println("thread : " + Thread.currentThread().getName() + " : " + index++);
}
}
}他说index的值是连续的,我看他运行的也是,但在我的机器上运行却不是连续,产生的进程对象顺序也不是连续的,为什么呢????

解决方案 »

  1.   

    你把while(true)改成,while(index<100),看一下一开始的几个值.
    个人感觉是因为几个线程都取得了index的值,但只能有一个线程在屏幕上打印,其他的都被卡在out.println那了
      

  2.   

    不应该是连续的,四个mt同名线程哪个先运行那个后运行完全是不可知的,所以打印出的结果不连续。这是我运行的结果:thread : Thread-3 : 4519
    thread : Thread-3 : 4520
    thread : Thread-3 : 4521
    thread : Thread-3 : 4522
    thread : Thread-0 : 4499
    thread : Thread-0 : 4524
    thread : Thread-0 : 4525
    thread : Thread-0 : 4526
    thread : Thread-0 : 4527
    thread : Thread-0 : 4528
    thread : Thread-0 : 4529
    thread : Thread-0 : 4530
    main : main
    main : main
    main : main
    main : main
    main : main
    main : main
    main : main
    main : main
    thread : Thread-3 : 4531
    thread : Thread-3 : 4533
    thread : Thread-3 : 4534
    thread : Thread-3 : 4535
    thread : Thread-3 : 4536
    thread : Thread-3 : 4537
    thread : Thread-3 : 4538
    thread : Thread-3 : 4539
    thread : Thread-1 : 4523
    thread : Thread-1 : 4540
    thread : Thread-1 : 4541
    thread : Thread-1 : 4542
    thread : Thread-1 : 4543
    thread : Thread-1 : 4544
    thread : Thread-1 : 4545
    thread : Thread-1 : 4546
    thread : Thread-2 : 4515
    thread : Thread-2 : 4548
    thread : Thread-2 : 4549
    thread : Thread-2 : 4550
    thread : Thread-2 : 4551
    thread : Thread-2 : 4552
    thread : Thread-2 : 4553
    thread : Thread-2 : 4554
    thread : Thread-3 : 4547
    thread : Thread-3 : 4556
    thread : Thread-3 : 4557
    thread : Thread-3 : 4558
    thread : Thread-3 : 4559
    thread : Thread-3 : 4560
    thread : Thread-3 : 4561
    thread : Thread-3 : 4562
    main : main
    main : main
    main : main
    main : main
    main : main
    main : main
    main : main
    main : main
    thread : Thread-0 : 4532
    thread : Thread-0 : 4565
    thread : Thread-0 : 4566
    thread : Thread-0 : 4567
    thread : Thread-0 : 4568
    thread : Thread-0 : 4569
    thread : Thread-0 : 4570
    thread : Thread-0 : 4571
    thread : Thread-3 : 4564
    thread : Thread-3 : 4572
    thread : Thread-3 : 4573
    thread : Thread-3 : 4574
    thread : Thread-3 : 4575
    thread : Thread-3 : 4576
    thread : Thread-3 : 4577
    thread : Thread-3 : 4578
    thread : Thread-2 : 4563
    thread : Thread-2 : 4580
    thread : Thread-2 : 4581
    thread : Thread-2 : 4582
    thread : Thread-2 : 4583
    thread : Thread-2 : 4584
    thread : Thread-2 : 4585
    thread : Thread-2 : 4586
    thread : Thread-1 : 4555
    thread : Thread-1 : 4588无限循环。
      

  3.   

    class TicketsSystem
    {
    public static void main(String[] args)
    {
    SellThread st = new SellThread();
    new Thread(st).start();
    new Thread(st).start();
    new Thread(st).start();
    new Thread(st).start();
    }
    }class SellThread implements Runnable
    {
    int tickets = 100;
    public void run()
    {
         while (tickets > 0)
         {
    System.out.println(Thread.currentThread().getName() + 
    " sell tickets : " + tickets);
    tickets--;
         }
    }
    }还有这个例子,孙鑫的视频里他运行的结果是100到1,但是我机器出来的结果是:
    Thread-0 sell tickets : 100
    Thread-3 sell tickets : 100
    Thread-1 sell tickets : 100
    Thread-2 sell tickets : 100
    Thread-1 sell tickets : 97
    Thread-3 sell tickets : 98
    Thread-3 sell tickets : 94
    Thread-0 sell tickets : 99
    Thread-3 sell tickets : 93
    Thread-3 sell tickets : 91
    Thread-3 sell tickets : 90
    Thread-1 sell tickets : 95
    Thread-2 sell tickets : 96
    Thread-2 sell tickets : 87
    Thread-3 sell tickets : 88
    Thread-1 sell tickets : 88
    Thread-1 sell tickets : 84
    Thread-1 sell tickets : 83
    Thread-1 sell tickets : 82
    Thread-0 sell tickets : 92
    Thread-1 sell tickets : 81
    Thread-3 sell tickets : 85
    Thread-2 sell tickets : 86
    Thread-3 sell tickets : 78
    Thread-1 sell tickets : 79
    Thread-0 sell tickets : 80
    Thread-1 sell tickets : 75
    Thread-3 sell tickets : 76
    Thread-2 sell tickets : 77
    Thread-3 sell tickets : 72
    Thread-1 sell tickets : 73
    Thread-0 sell tickets : 74
    Thread-1 sell tickets : 69
    Thread-3 sell tickets : 70
    Thread-2 sell tickets : 71
    Thread-2 sell tickets : 65
    Thread-2 sell tickets : 64
    Thread-3 sell tickets : 66
    Thread-3 sell tickets : 62
    Thread-3 sell tickets : 61
    Thread-3 sell tickets : 60
    Thread-1 sell tickets : 67
    Thread-0 sell tickets : 68
    Thread-1 sell tickets : 58
    Thread-3 sell tickets : 59
    Thread-2 sell tickets : 63
    Thread-3 sell tickets : 55
    Thread-1 sell tickets : 56
    Thread-0 sell tickets : 57
    Thread-0 sell tickets : 51
    Thread-0 sell tickets : 50
    Thread-0 sell tickets : 49
    Thread-0 sell tickets : 48
    Thread-0 sell tickets : 47
    Thread-0 sell tickets : 46
    Thread-0 sell tickets : 45
    Thread-0 sell tickets : 44
    Thread-0 sell tickets : 43
    Thread-0 sell tickets : 42
    Thread-0 sell tickets : 41
    Thread-0 sell tickets : 40
    Thread-0 sell tickets : 39
    Thread-0 sell tickets : 38
    Thread-0 sell tickets : 37
    Thread-0 sell tickets : 36
    Thread-0 sell tickets : 35
    Thread-0 sell tickets : 34
    Thread-0 sell tickets : 33
    Thread-0 sell tickets : 32
    Thread-0 sell tickets : 31
    Thread-0 sell tickets : 30
    Thread-0 sell tickets : 29
    Thread-1 sell tickets : 52
    Thread-1 sell tickets : 27
    Thread-1 sell tickets : 26
    Thread-1 sell tickets : 25
    Thread-3 sell tickets : 53
    Thread-2 sell tickets : 54
    Thread-3 sell tickets : 23
    Thread-1 sell tickets : 24
    Thread-0 sell tickets : 28
    Thread-1 sell tickets : 20
    Thread-3 sell tickets : 21
    Thread-2 sell tickets : 22
    Thread-3 sell tickets : 17
    Thread-1 sell tickets : 18
    Thread-0 sell tickets : 19
    Thread-1 sell tickets : 14
    Thread-3 sell tickets : 15
    Thread-2 sell tickets : 16
    Thread-2 sell tickets : 10
    Thread-2 sell tickets : 9
    Thread-2 sell tickets : 8
    Thread-2 sell tickets : 7
    Thread-3 sell tickets : 11
    Thread-3 sell tickets : 5
    Thread-3 sell tickets : 4
    Thread-3 sell tickets : 3
    Thread-1 sell tickets : 12
    Thread-0 sell tickets : 13
    Thread-1 sell tickets : 1
    Thread-3 sell tickets : 2
    Thread-2 sell tickets : 6奇怪?????
      

  4.   

    我把while(true)改成inex<100,结果是这样的:
    thread : Thread-1 : 7
    thread : Thread-0 : 0
    thread : Thread-0 : 8
    thread : Thread-0 : 9
    thread : Thread-0 : 10
    thread : Thread-0 : 11
    thread : Thread-3 : 3
    thread : Thread-3 : 13
    thread : Thread-3 : 14
    thread : Thread-3 : 15
    thread : Thread-3 : 16
    thread : Thread-3 : 17
    thread : Thread-3 : 18
    thread : Thread-2 : 2
    thread : Thread-2 : 20
    thread : Thread-2 : 21
    thread : Thread-2 : 22
    thread : Thread-2 : 23
    thread : Thread-2 : 24
    thread : Thread-0 : 19
    thread : Thread-0 : 26
    thread : Thread-0 : 27
    thread : Thread-0 : 28
    thread : Thread-0 : 29
    thread : Thread-0 : 30
    thread : Thread-0 : 31
    thread : Thread-0 : 32
    thread : Thread-1 : 12
    thread : Thread-1 : 34
    thread : Thread-1 : 35
    thread : Thread-1 : 36
    thread : Thread-1 : 37
    thread : Thread-1 : 38
    thread : Thread-1 : 39
    thread : Thread-1 : 40
    thread : Thread-2 : 33
    thread : Thread-2 : 42
    thread : Thread-2 : 43
    thread : Thread-2 : 44
    thread : Thread-2 : 45
    thread : Thread-2 : 46
    thread : Thread-2 : 47
    thread : Thread-2 : 48
    thread : Thread-3 : 25
    thread : Thread-3 : 50
    thread : Thread-3 : 51
    thread : Thread-3 : 52
    thread : Thread-3 : 53
    thread : Thread-3 : 54
    thread : Thread-3 : 55
    thread : Thread-3 : 56
    thread : Thread-1 : 49
    thread : Thread-1 : 58
    thread : Thread-1 : 59
    thread : Thread-1 : 60
    thread : Thread-1 : 61
    thread : Thread-1 : 62
    thread : Thread-1 : 63
    thread : Thread-1 : 64
    thread : Thread-0 : 41
    thread : Thread-0 : 66
    thread : Thread-0 : 67
    thread : Thread-0 : 68
    thread : Thread-0 : 69
    thread : Thread-0 : 70
    thread : Thread-0 : 71
    thread : Thread-0 : 72
    thread : Thread-3 : 65
    thread : Thread-3 : 74
    thread : Thread-3 : 75
    thread : Thread-3 : 76
    thread : Thread-3 : 77
    thread : Thread-3 : 78
    thread : Thread-3 : 79
    thread : Thread-3 : 80
    thread : Thread-2 : 57
    thread : Thread-2 : 82
    thread : Thread-2 : 83
    thread : Thread-2 : 84
    thread : Thread-2 : 85
    thread : Thread-2 : 86
    thread : Thread-2 : 87
    thread : Thread-2 : 88
    thread : Thread-0 : 81
    thread : Thread-0 : 90
    thread : Thread-0 : 91
    thread : Thread-0 : 92
    thread : Thread-0 : 93
    thread : Thread-0 : 94
    thread : Thread-0 : 95
    thread : Thread-0 : 96
    thread : Thread-1 : 73
    thread : Thread-1 : 98
    thread : Thread-1 : 99
    thread : Thread-2 : 97
    thread : Thread-3 : 89好象可以这样解释:比如mt3取得一个值,还有没来得及打印,就立刻转入runnable, 然后可能此前取得值的mt2拿的了lock然后打印输出。所以结果不连续。
      

  5.   

    得说明一点,CPU在同一时间运行什么线程,我们是无法控制的,机子的不同或是系统的不同,线程的运行方式是会有所不同,何时运行什么线程是cpu在管理.所以在编程时要注意这个问题.在编写的程序里什么时候运行线程,运行什么线程,我们是无法控制的.
      

  6.   

    视频里,孙鑫加了线程同步,我运行例子,值是连续了,但为什么只有两个线程参加呢?? new 了四个线程,不是应该有四个线程参加的吗?? 加了同步方法也一样,我把它注释了class TicketsSystem
    {
    public static void main(String[] args)
    {
    SellThread st = new SellThread();
    new Thread(st).start();
    new Thread(st).start();
    new Thread(st).start();
    new Thread(st).start();
    }
    }class SellThread implements Runnable
    {
    int tickets = 100;
    Object obj = new Object();
    public void run()
    {
         while (true)
         {
         synchronized(obj)
         {
             if (tickets > 0)
             {
             try
             {
             Thread.sleep(10);
             }
             catch (Exception e)
             {
             e.printStackTrace();
             }
             System.out.println(Thread.currentThread().getName() + 
             " sell tickets : " + tickets);
             tickets--;
             }
         }
         //sell();
         }
    }
    /*public synchronized void sell()
    {
    if (tickets > 0)
    {
    try
    {
    Thread.sleep(10);
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + 
    " sell tickets : " + tickets);
    tickets--;
    }
    }*/
    }
      

  7.   

    上面有一楼说的很清楚了,是因为时间片的轮换导致的结果,这个是无法控制的,而且不同操作系统,不同的CPU也不一样啊!呵呵……本人也经常看孙鑫的视频,不过关于他的web开发的视频不是很多,所以我现在看张孝祥的了……