java多线程:volatile及Timer用法示例

来源:互联网 发布:兴华软件 编辑:程序博客网 时间:2024/06/07 20:07

最近写程序时,需要在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;}@Overridepublic 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 详解"之类的关键字,此处不再赘述。



0 0