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

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 02:22   102   0

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



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP