close

undefined

使用多線程來跑程式的時候,有時候會遇到資源共享的問題造成記憶體或其他資料的非同步或是不對稱。

當遇到這類型的問題時,就會想確保線程中某個使用共同變數的程式先執行完,再繼續其他線程的運作。

下述的程式碼就是執行兩個線程(一般的多線程):

package Test;

public class ThreadAndSynchronized implements Runnable{

	private int num = 0;
	
	public ThreadAndSynchronized(int i){
		this.num = i;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<5;i++)
			System.out.println("Thread: " + num);

	}
	
	public static void main(String args[]){
		ThreadAndSynchronized tas1 = new ThreadAndSynchronized(1);
		Thread t1 = new Thread(tas1,"Thread 1");
		ThreadAndSynchronized tas2 = new ThreadAndSynchronized(2);
		Thread t2 = new Thread(tas2,"Thread 2");
		t1.start();
		t2.start();
	}
}

 

 

執行結果:

Thread: 2

Thread: 1

Thread: 2

Thread: 1

Thread: 1

Thread: 2

Thread: 1

Thread: 1

Thread: 2

Thread: 2

但是如果 run() 函數中的某個值是希望被執行完畢再進行下一步,我們就可以用 synchronized(Name.class){} 來強迫執行完才可以繼續其他行為。

程式碼如下:

package Test;

public class ThreadAndSynchronized implements Runnable{

	private int num = 0;
	
	public ThreadAndSynchronized(int i){
		this.num = i;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		synchronized(ThreadAndSynchronized.class){
			for(int i=0;i<5;i++)
				System.out.println("Thread: " + num);
		}

	}
	
	public static void main(String args[]){
		ThreadAndSynchronized tas1 = new ThreadAndSynchronized(1);
		Thread t1 = new Thread(tas1,"Thread 1");
		ThreadAndSynchronized tas2 = new ThreadAndSynchronized(2);
		Thread t2 = new Thread(tas2,"Thread 2");
		t1.start();
		t2.start();
	}
}

 

執行結果

Thread: 1

Thread: 1

Thread: 1

Thread: 1

Thread: 1

Thread: 2

Thread: 2

Thread: 2

Thread: 2

Thread: 2

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 葛瑞斯肯 的頭像
    葛瑞斯肯

    葛瑞斯肯樂活筆記

    葛瑞斯肯 發表在 痞客邦 留言(0) 人氣()