下面是我对多线程的一个测试:
public 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();
}
}
class MyThread implements Runnable{
int index;
int i;
public void run()
{
  while(i<20)
  {
      System.out.println(Thread.currentThread().getName()+":"+index++);
      i++;
  }    
}}
运行结果是:Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-1:8
Thread-2:9
Thread-3:10
Thread-1:11
Thread-2:12
Thread-3:13
Thread-1:14
Thread-2:15
Thread-3:16
Thread-1:17
Thread-2:18
Thread-3:19
Thread-1:20
Thread-2:21
Thread-3:22我就不明白,为什么打印出的值是连续的?我试过,换成普通的类(非线程类),就没这种情况,还有就是怎么会打印到22呢?
请斑竹和各位高手指点。

解决方案 »

  1.   

    Thread(Runnable XX) 中的参数是什么意识
      

  2.   

    因为你所有Thread对象都是用的MyThread这个对象,所以4个线程都会去调用MyThread的run方法。所以你的输出时连续的,而且又因为没有同步,结果超过20也不奇怪。
      

  3.   

    foxty(狐狸糊涂) 正解 同步的话应该只会打到20
      

  4.   

    严重同意treeroot(旗鲁特)的说法
      

  5.   

    int index;
    int i=0;
    public void run()
    {
      while(i<20)
      {
          System.out.println(Thread.currentThread().getName()+":"+i);
          i++;
      }    
    }
      

  6.   

    Thread-0:0
    Thread-0:1
    Thread-0:2
    Thread-0:3
    Thread-0:4
    Thread-0:5
    Thread-0:6
    Thread-0:7
    Thread-1:7
    Thread-2:7
    Thread-这后面的数才是你的线成名,是随即的,后面的数是你的I的值
      

  7.   

    public 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();
        new Thread(mt).start();
        new Thread(mt).start();
        new Thread(mt).start();
        new Thread(mt).start();    
    }
    }
    class MyThread implements Runnable{
    int index;
    int i;
    String k = "";
    public void run()
    {
      while(i<20)
      {
        k = Thread.currentThread().getName() + ":" +i;
          System.out.println(k);
          i++;
      }    
      System.out.println("finally i is : " + i);
    }}你从这个就可以看出实际的结果了。
    另外,我觉得如果将代码写开些,比如:
     System.out.println(Thread.currentThread().getName()+":"+index++);
    写成
        k = Thread.currentThread().getName() + ":" +i;
          System.out.println(k);
          i++;
    线程分散的效果更好,(这个是我个人的感觉),不知道大家对此有没有什么想法?
      

  8.   

    我在想,楼主的程序似乎用了同步也是打印出:
    Thread-0:0
    Thread-0:1
    Thread-0:2
    Thread-0:3
    Thread-0:4
    Thread-0:5
    Thread-0:6
    Thread-0:7
    Thread-1:8
    Thread-2:9
    Thread-3:10
    Thread-1:11
    Thread-2:12
    Thread-3:13
    Thread-1:14
    Thread-2:15
    Thread-3:16
    Thread-1:17
    Thread-2:18
    Thread-3:19
    Thread-1:20而不是每个线程打一次0-20....因为每个线程都调用同一个对象中的属性代码验证中...
      

  9.   

    如果你想要每个线程都打印出0-19,应该是:
    public class MultiThread
    {
    public static void main(String[] args)
    { MyThread mt1 = new MyThread();
    MyThread mt2 = new MyThread();
    MyThread mt3 = new MyThread();
    MyThread mt4 = new MyThread();
    new Thread(mt1).start();
    new Thread(mt2).start();
    new Thread(mt3).start();
    new Thread(mt4).start();
    }
    }
      

  10.   

    经过验证liang8305的结论是对的.
      

  11.   

    首先谢谢大家的帮忙,参考了大家的意见和有关书籍之后,归纳如下:
    (1) 我的初衷是想知道为什么用Runnable接口实现的线程能访问同一资源.这一点上有的朋友理解上有偏差,我觉得foxty(狐狸糊涂)说得较为清楚和合理一些.
    (2) 我试过同步,确实可行.至于为什么能打印到22,我的理解是,可能当有一个或几个线程进入循环后,它们运行的时间片到了,等到再轮到是index可能等于20了,再运行程序index的值就是22了.
    这是我个人的一点看法,如果大家还有更好的解释,请不要吝啬,贴出来交流一下.
      

  12.   

    首先用Runnable接口实现的线程能访问同一资源(本例中为对象mt);
    出现大于20是因为System.out.println(Thread.currentThread().getName()+":"+index++);
          i++;这两句中间发生线程切换,即同步问题。
    至于连续打印的问题,我认为Java多线程中每行代码作为原语处理,执行当中不允许线程切换,导致index每次加一后立即打印出来。
    有不对的请指教!
      

  13.   

    为什么会打印出超过20的数字很容易理解。因为run方法同时会被几个线程来执行,当i=19的时候,这个时候或许有几个线程都正好执行到乐while语句块内部,所以加起来就有可能超过20了。