/*

public class Bird extends Thread {
private int a=1;

public void run(){

for(int i=0;i<10;i++){
a+=i;
Thread.yield();
a-=i;
System.out.println(a);
  }
}
public static void main(String args[]){

Bird bird1=new Bird();
Bird bird2=new Bird();
bird1.start();
bird2.start();
}

}
*/
public class Bird implements Runnable{
private int a=1;
public void run(){

for(int i=0;i<10;i++){
a+=i;
Thread.yield();
a-=i;
System.out.println(a);
}
}
public static void main(String args[]){
Bird bird=new Bird();
Thread t1=new Thread(bird);
Thread t2=new Thread(bird);
t1.start();
t2.start();
}
}
我想问下两个程序有什么不同,为什么运行结果完全不一样.

解决方案 »

  1.   

    yield()方法在这里是暂停当前正在执行的线程对象,并执行其他线程。其实两种程序的写法不同,但是作用是一致的,也就是说第二种runnable的写法是前面一种写法的等价物。因为线程运行具有不确定性,因为他是并发的,谁先谁后不能确定,所以打印出来的结果不一致,你完全不必担心。就是这里的同一种程序,你可能在不同机器上不同的时间打印出来的结果也可能不一样。
      

  2.   

    1,在java中实现多线程有两种方法,一个是直接继承Thread类,一个是实现Runnable接口,但是推荐的是第二种。因为在逻辑上应该要把一个线程要做的事情以及做这个事情的方法分开;对于Thread来讲,它只负责线程的操作,而具体要做的事情就应该放在Runnable中。但不管是那种方式,都要实现public void run()方法,但启动线程用start而不是run。2,Thread.yield(): 暂停当前正在执行的线程对象,并执行其他线程。
      

  3.   

    Bird bird1=new Bird(); 
    Bird bird2=new Bird(); 
    bird1.start(); 
    bird2.start(); 
    //这是对2个对象的Thread t1=new Thread(bird); 
    Thread t2=new Thread(bird); 
    t1.start(); 
    t2.start(); 
    //这是对一个对象的!
      

  4.   

    Bird bird1=new Bird();
    Bird bird2=new Bird();
    bird1.start();
    bird2.start(); 
    是不同的Bird 实例
    Bird bird=new Bird();
    Thread t1=new Thread(bird);
    Thread t2=new Thread(bird);
    t1.start();
    t2.start();
    是相同的实例,只是开启了两条线程
      

  5.   

    加上synchronized,结果一样吗?
      

  6.   

    原因很简单,第一个例子中,你创建了两个线程,这两个线和是各自独立的,彼此不相干扰,
    而第二个就不一样了,是两个线程去同访问一个类,有可能一个线程同要执行System....,而另一个线程又执行了一次a+=i,所以就会出现不一样的效果了,
    也就是说,第二个发生了线程并发访问的情况,而第一个没有
      

  7.   


    完全同意这个观点,
    可以试试这个程序:public class Bird implements Runnable {
    private int a = 1; public void run() { for (int i = 0; i < 10; i++) {
    a += i;
    Thread.yield();
    a -= i;
    System.out.println(a);
    }
    } public static void main(String args[]) {
    Bird bird1 = new Bird();
    Bird bird2 = new Bird();
    Thread t1 = new Thread(bird1);
    Thread t2 = new Thread(bird2);
    t1.start();
    t2.start();
    }
    }