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