在线程中,run方法中调用的变量不同,那么程序运行的结果也不同,变量属于成员变量还是属于局部变量,要处理对象的变量还是方法中的变量会导致结果的差异性。
1)线程处理了全局变量
package com.medivh.thread; public class ThreadTest3 { public static void main(String[] args) { Runnable f = new First(); Thread t = new Thread(f); Thread t1 = new Thread(f); t.start(); t1.start(); } } class First implements Runnable { int i; public void run() { int i=0; while (true) { System.out.println("First"+ this.i++); try { Thread.sleep((long) Math.random()*1000); } catch (InterruptedException e) { e.printStackTrace(); } if(10==this.i) { break; } } } }测试结果:
First0
First1
First2
First3
First4
First5
First6
First7
First8
First9
至始至终只有一个First对象,而方法中调用的是this.i 那么就是全部变量,所以当全局变量i==10时,run方法结束。
2)线程调用局部变量
package com.medivh.thread; public class ThreadTest3 { public static void main(String[] args) { Runnable f = new First(); Thread t = new Thread(f); Thread t1 = new Thread(f); t.start(); t1.start(); } } class First implements Runnable { int i; public void run() { int i=0; while (true) { System.out.println("First"+ i++); try { Thread.sleep((long) Math.random()*1000); } catch (InterruptedException e) { e.printStackTrace(); } if(10==i) { break; } } } }
测试结果:
First0
First1
First2
First3
First4
First5
First6
First7
First8
First9
First0
First1
First2
First3
First4
First5
First6
First7
First8
First9
run方法中调用的this.i的全局变量,而只调用的方法中的变量,而方法执行了两次,所以结果有20条。