java timer 守护线程_Java Timer的使用,守护线程

package cn.vicky;

import java.util.Timer;

/**

* Timer : 提供对计时器 MBean 的实现。 计时器 MBean 将在指定的时间发出警告,以唤醒所有注册的侦听器来接收计时器通知。 此类管理一个过期的计时器通知列表。

* 这是一种允许用户根据需要任意添加/移除通知的方法。 当计时器发出计时器通知并过时后,会将该通知自动从计时器通知列表中移除。 可以将其他计时器通知添加到常规重复发送的通知中。

*/

public class MyTimer {

public static void main(String[] args) {

Timer timer = new Timer();

// 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.

timer.schedule(new MyTask(), 1000, 2000);

// 这个是用来停止此任务的,否则就一直循环执行此任务了

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}

// 使用这个方法退出任务

timer.cancel();

}

static class MyTask extends java.util.TimerTask {

@Override

public void run() {

System.out.println("Done !");

}

}

}

执行结果:

Done !

Done !

Done !

Done !

……

守护线程的实现。这是我对Timer比较满意的功能,很好,很强大^_^!

package cn.vicky;

import java.util.Timer;

import java.util.TimerTask;

public class MyTimer2 {

private String name;

private long timeOut;

private Thread thread;

public MyTimer2(String name, long timeOut) {

this.name = name;

this.timeOut = timeOut;

}

/**

* 在节点的处理线程消耗的时间过长时,计时器将调用{@link System#exit System.exit} 系统退出的方法,强制该节点的事务处理线程关闭。这个计时器是一个守护进程,

* 所以当一个服务正常完整的关闭时,任务不会运行该程序。

*/

public void startShutdownTimeout(long timeOut) {

new Timer(true).schedule(new TimerTask() { // true,表示执行的线程是一个守护线程

@Override

public void run() {

System.out.println("线程" + name + "超时,执行守护线程 !");

// System.exit(1);

thread.stop();

}

}, timeOut);

}

public void myTest() {

thread = new Thread(){

@Override

public void run() {

startShutdownTimeout(timeOut); // 该线程受到守护线程的作用

System.out.println(name + "Begin");

try {

Thread.sleep(200); // 函数要执行至少200毫秒

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(name + "Over");

}

};

thread.start();

}

public static void main(String[] args) {

MyTimer2 m1 = new MyTimer2("1 - ", 100);

MyTimer2 m2 = new MyTimer2("2 - ", 180);

MyTimer2 m3 = new MyTimer2("3 - ", 250);

MyTimer2 m4 = new MyTimer2("4 - ", 320);

m1.myTest();

m2.myTest();

m3.myTest();

m4.myTest();

}

}

执行结果:

2 - Begin

3 - Begin

4 - Begin

1 - Begin

线程1 - 超时,执行守护线程 !

线程2 - 超时,执行守护线程 !

3 - Over

4 - Over

package cn.vicky;

import java.io.IOException;

import java.util.Timer;

/*

* 本类给出了使用Timer和TimerTaske的主要方法,其中包括定制任务,添加任务退出任务,退出定时器.

* 因为TimerTask的status域是包级可访问的,所以没有办法在java.util.包外得到其状态,这对编程造成一些不便.

* 我们不能判断某个Task的状态了.

*/

public class MyTimer3 {

public static void main(String[] args) {

Timer timer = new Timer();

MyTask myTask1 = new MyTask();

MyTask myTask2 = new MyTask();

myTask2.setInfo("myTask-2");

timer.schedule(myTask1, 1000, 5000);

timer.scheduleAtFixedRate(myTask2, 2000, 5000);

while (true) {

try {

byte[] info = new byte[1024];

int len = System.in.read(info);

String strInfo = new String(info, 0, len, "GBK");// 从控制台读出信息

if (strInfo.charAt(strInfo.length() - 1) == ' ') {

strInfo = strInfo.substring(0, strInfo.length() - 2);

}

if (strInfo.startsWith("Cancel-1")) {

// 退出单个任务

myTask1.cancel();

// 其实应该在这里判断myTask2是否也退出了,是的话就应该break.但是因为无法在包外得到

// myTask2的状态,所以,这里不能做出是否退出循环的判断.

} else if (strInfo.startsWith("Cancel-2")) {

myTask2.cancel();

} else if (strInfo.startsWith("Cancel-All")) {

// 退出Timer

timer.cancel();

break;

} else {

// 只对myTask1作出判断,偷个懒^_^

myTask1.setInfo(strInfo);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

static class MyTask extends java.util.TimerTask {

String info = "^_^";

@Override

public void run() {

System.out.println(info);

}

public String getInfo() {

return info;

}

public void setInfo(String info) {

this.info = info;

}

}

}

执行结果:

^_^

myTask-2

^_^

myTask-2

OY  //  输入的内容,将替换原有的

OY

myTask-2

OY

myTask-2

OY

(vicky)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值