執行緒中全域性變數和成員變數
阿新 • • 發佈:2019-02-14
線上程中,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條。