1. 程式人生 > >執行緒中全域性變數和成員變數

執行緒中全域性變數和成員變數

線上程中,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條。