1. 程式人生 > >java多執行緒:volatile及Timer用法示例

java多執行緒:volatile及Timer用法示例

最近寫程式時,需要在java中使用多執行緒共享程式變數。

特別地,我需要另一個執行緒中執行類A的方法function_1。但給定的執行時間只有n毫秒,也就是說我會在n毫秒之後終止function_1的執行。

但問題是,我在主執行緒隨後的程式碼中無法判斷funcion_1是壽終正寢呢,還是被我的主執行緒殺死的。我想到的解決方案就是在類A中設定一個標誌變數finished,初始為false。當function_1正常結束後,會將finished修改為true。在正式編寫程式碼之前,我先編寫了如下的程式碼樣例:

import java.util.Timer;
import java.util.TimerTask;

class MyTask extends TimerTask{
	private Task m = null;
	
	public MyTask(Task m) {
		this.m = m;
	}
		
	@Override
	public void run() {
		// TODO 自動生成的方法存根
		m.n++;
		System.out.printf("Hello:\t%d\t%d\n", m.n ,System.currentTimeMillis());
	}	
}

public class Task {
	public volatile int n = 0;
	//public int n = 0;
		
	public void runTask() throws InterruptedException {
		Timer timer = new Timer();
		timer.schedule(new MyTask(this), 0, 20);
		while (n != 10){
		}
		timer.cancel();
	}
}
其中Main類程式碼如下:
public class Main {

	public static void main(String[] args) throws InterruptedException {
		Task t = new Task();
		t.runTask();
	}
}

程式的主程序(主執行緒)從Main類的main方法進入,然後執行類Task的runTask方法。隨後runTask中新建了一個定時器執行緒,該執行緒每隔20毫秒執行一次MyTask類的run方法。

現在,我們有兩個執行緒。主執行緒的while(n != 10)不停的檢測n的值,當n為10的時候就終止另一個執行緒;而另一個執行緒則每隔20毫秒對n進行自增,並輸出相關資訊。

好了,基本的描述就是這樣了。從上面的示例程式碼中,已經給出了Timer時鐘的基本用法,以及如何傳遞引數(自定義MyTask類)。同時,也給出了其中一個執行緒監測另一個執行緒執行狀態的基本輸入(Task類的成員變數n)。

而接下來就該說說volatile關鍵字的作用了。在上述程式碼中,在宣告成員變數n的時候有兩行程式碼,一行使用了volatile,一行沒有。實際執行程式測試發現,當宣告使用了volatile,程式將給出10行輸出;而當沒有使用關鍵字volatile修飾變數n的宣告時,程式將永不停止。

關於volatile的作用,可以google諸如“volatile 詳解"之類的關鍵字,此處不再贅述。