/*
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();
}
}
我想问下两个程序有什么不同,为什么运行结果完全不一样.
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();
}
}
我想问下两个程序有什么不同,为什么运行结果完全不一样.
Bird bird2=new Bird();
bird1.start();
bird2.start();
//这是对2个对象的Thread t1=new Thread(bird);
Thread t2=new Thread(bird);
t1.start();
t2.start();
//这是对一个对象的!
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();
是相同的实例,只是开启了两条线程
而第二个就不一样了,是两个线程去同访问一个类,有可能一个线程同要执行System....,而另一个线程又执行了一次a+=i,所以就会出现不一样的效果了,
也就是说,第二个发生了线程并发访问的情况,而第一个没有
完全同意这个观点,
可以试试这个程序: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();
}
}