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 详解"之类的关键字,此处不再赘述。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值