下面这个程序为什么会有 1 0 2 3 4 和 0 1 1 2 3 4 0 这样2个输出?
class test{
public static void main(String str[]){
useRunnable ur = new useRunnable();
Thread t = new Thread(ur);
t.start(); Thread t1 = new Thread(ur);
t1.start(); }
}
class useRunnable implements Runnable{
int i;
public void run(){
i = 0;
while(i<5){
System.out.print(i++);
} }
}

解决方案 »

  1.   


    Thread t = new Thread(ur); 
    t.start(); Thread t1 = new Thread(ur); 
    t1.start();启动了2次输出0123401234
      

  2.   


    Thread t = new Thread(ur); 
    t.start(); Thread t1 = new Thread(ur); 
    t1.start(); 
    一点拙见啊
    大概是多线程同步问题
    虽然你不是一起start()的
    但是start不等于九run了
    还是有可能有干扰的
    而且 i++不是一个原子操作
    应该用synchronized{this}块包起来
      

  3.   

    synchronized(this){}
    或者是把i++放到一个同步方法里
      

  4.   

    因为两个线程调用了同一个对象(ur)。并且没有对ur同步。
    要达到0123401234这个效果必须要同步。如下:
    synchronized(this){
      i = 0; 
    while(i <5)

      System.out.print(i++); 

    }
      

  5.   

    i++不是原子操作.需要将i装入寄存器.然后是加1操作,然后再将i调回内存.在这三个步骤中,线程随时可能中断,并唤醒另一线程继续操作.比如,当线程1,执行好i+1操作时,线程中断立刻,并唤醒线程2,线程2执行好i++操作后,在下个输出前中断了,线程1被唤醒,继续执行将寄存器中i的值调回内存.此时线程2的操作便无效了.等到线程2下次被唤醒的时候,输出的i是线程1所执行的结果.
    两个线程中调用的i,都是内存中的同一个位置.int i; 
    public void run(){ 
    i = 0; 
    while(i <5){ 
    System.out.print(i++);}}这是run方法的字节码,线程在下面每个基本操作时,都可能被中断
    public void run();
      Code:
       Stack=5, Locals=1, Args_size=1
       0:   aload_0
       1:   iconst_0
       2:   putfield        #2; //Field i:I
       5:   aload_0
       6:   getfield        #2; //Field i:I
       9:   iconst_5
       10:  if_icmpge       33
       13:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStrea
       16:  aload_0
       17:  dup
       18:  getfield        #2; //Field i:I
       21:  dup_x1
       22:  iconst_1
       23:  iadd
       24:  putfield        #2; //Field i:I
       27:  invokevirtual   #4; //Method java/io/PrintStream.print:(I)V
       30:  goto    5
       33:  return
      

  6.   

    机器配置一样吗?
    线程和你的操作系统还有硬件也是有一定关系的
    对于时间片的分配
    你可以在while前让它休眠一下sleep因该会有1 0 2 3 4