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 详解"之类的关键字,此处不再赘述。
- java多线程:volatile及Timer用法示例
- java多线程总结四:volatile、synchronized示例
- java多线程总结四:volatile、synchronized示例
- java多线程总结四:volatile、synchronized示例
- 【多线程】volatile用法
- 多线程中关键字Volatile的用法及作用
- java Timer示例
- Android Timer的用法示例
- Android Timer 的用法示例
- Java多线程--Timer
- volatile含义及用法
- java多线程入门知识及示例程序
- java多线程中的volatile
- Java多线程 -- volatile关键字
- java多线程--volatile关键字
- Java 多线程:volatile关键字
- Java多线程中的volatile
- java 多线程 volatile 关键字
- 参加某nb业务的后台架构分享
- GoLang之环境变量和Project目录配置的方法
- sql 学习技巧(看到不错,拿来学习)
- "此操作要求连接到 'master' 数据库。无法创建与 'master' 数据库之间的连接,这是因为已打开原始数据库连接,并且已从连接字符串中删除凭据。请提供未打开的连接。"
- jsp中的scriptlet
- java多线程:volatile及Timer用法示例
- Resolution of error reporting when using maven3 test function together with nexus
- 在FFMPEG中使用libRTMP的经验
- PHP的URL处理
- 关于C++构造函数
- jQuery插件:简易年月日选择器
- 怎么调试PHP程序
- 笔记:堆内存与栈内存的区别
- 各种音视频编解码学习详解