Chinaunix首页 | 论坛 | 博客
  • 博客访问: 230083
  • 博文数量: 75
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 848
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-08 10:27
文章分类
文章存档

2014年(9)

2013年(66)

我的朋友

分类: Java

2013-12-29 14:25:49

最近写程序时,需要在java中使用多线程共享程序变量。


特别地,我需要另一个线程中执行类A的方法function_1。但给定的执行时间只有n毫秒,也就是说我会在n毫秒之后终止function_1的执行。


但问题是,我在主线程随后的代码中无法判断funcion_1是寿终正寝呢,还是被我的主线程杀死的。我想到的解决方案就是在类A中设置一个标志变量finished,初始为false。当function_1正常结束后,会将finished修改为true。在正式编写代码之前,我先编写了如下的代码样例:


[java] view plaincopy
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类代码如下:
[java] view plaincopy
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 详解"之类的关键字,此处不再赘述。
阅读(1332) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~