Java Timer的使用,守护线程。

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 02:22   34   0
分类: Java 877人阅读 评论(1) 收藏 举报

  1. package cn.vicky;
  2. import java.util.Timer;
  3. /**
  4. * Timer : 提供对计时器 MBean 的实现。 计时器 MBean 将在指定的时间发出警告,以唤醒所有注册的侦听器来接收计时器通知。 此类管理一个过期的计时器通知列表。
  5. * 这是一种允许用户根据需要任意添加/移除通知的方法。 当计时器发出计时器通知并过时后,会将该通知自动从计时器通知列表中移除。 可以将其他计时器通知添加到常规重复发送的通知中。
  6. */
  7. public class MyTimer {
  8. public static void main(String[] args) {
  9. Timer timer = new Timer();
  10. // 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.
  11. timer.schedule(new MyTask(), 1000, 2000);
  12. // 这个是用来停止此任务的,否则就一直循环执行此任务了
  13. try {
  14. Thread.sleep(10000);
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. }
  18. // 使用这个方法退出任务
  19. timer.cancel();
  20. }
  21. static class MyTask extends java.util.TimerTask {
  22. @Override
  23. public void run() {
  24. System.out.println("Done !");
  25. }
  26. }
  27. }

Done !
Done !
Done !
Done !
……

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

  1. package cn.vicky;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. public class MyTimer2 {
  5. private String name;
  6. private long timeOut;
  7. private Thread thread;
  8. public MyTimer2(String name, long timeOut) {
  9. this.name = name;
  10. this.timeOut = timeOut;
  11. }
  12. /**
  13. * 在节点的处理线程消耗的时间过长时,计时器将调用{@link System#exit System.exit} 系统退出的方法,强制该节点的事务处理线程关闭。这个计时器是一个守护进程,
  14. * 所以当一个服务正常完整的关闭时,任务不会运行该程序。
  15. */
  16. public void startShutdownTimeout(long timeOut) {
  17. new Timer(true).schedule(new TimerTask() { // true,表示执行的线程是一个守护线程
  18. @Override
  19. public void run() {
  20. System.out.println("线程" + name + "超时,执行守护线程 !");
  21. // System.exit(1);
  22. thread.stop();
  23. }
  24. }, timeOut);
  25. }
  26. public void myTest() {
  27. thread = new Thread(){
  28. @Override
  29. public void run() {
  30. startShutdownTimeout(timeOut); // 该线程受到守护线程的作用
  31. System.out.println(name + "Begin");
  32. try {
  33. Thread.sleep(200); // 函数要执行至少200毫秒
  34. } catch (InterruptedException e) {
  35. e.printStackTrace();
  36. }
  37. System.out.println(name + "Over");
  38. }
  39. };
  40. thread.start();
  41. }
  42. public static void main(String[] args) {
  43. MyTimer2 m1 = new MyTimer2("1 - ", 100);
  44. MyTimer2 m2 = new MyTimer2("2 - ", 180);
  45. MyTimer2 m3 = new MyTimer2("3 - ", 250);
  46. MyTimer2 m4 = new MyTimer2("4 - ", 320);
  47. m1.myTest();
  48. m2.myTest();
  49. m3.myTest();
  50. m4.myTest();
  51. }
  52. }

2 - Begin
3 - Begin
4 - Begin
1 - Begin
线程1 - 超时,执行守护线程 !
线程2 - 超时,执行守护线程 !
3 - Over
4 - Over

  1. package cn.vicky;
  2. import java.io.IOException;
  3. import java.util.Timer;
  4. /*
  5. * 本类给出了使用Timer和TimerTaske的主要方法,其中包括定制任务,添加任务退出任务,退出定时器.
  6. * 因为TimerTask的status域是包级可访问的,所以没有办法在java.util.包外得到其状态,这对编程造成一些不便.
  7. * 我们不能判断某个Task的状态了.
  8. */
  9. public class MyTimer3 {
  10. public static void main(String[] args) {
  11. Timer timer = new Timer();
  12. MyTask myTask1 = new MyTask();
  13. MyTask myTask2 = new MyTask();
  14. myTask2.setInfo("myTask-2");
  15. timer.schedule(myTask1, 1000, 5000);
  16. timer.scheduleAtFixedRate(myTask2, 2000, 5000);
  17. while (true) {
  18. try {
  19. byte[] info = new byte[1024];
  20. int len = System.in.read(info);
  21. String strInfo = new String(info, 0, len, "GBK");// 从控制台读出信息
  22. if (strInfo.charAt(strInfo.length() - 1) == ' ') {
  23. strInfo = strInfo.substring(0, strInfo.length() - 2);
  24. }
  25. if (strInfo.startsWith("Cancel-1")) {
  26. // 退出单个任务
  27. myTask1.cancel();
  28. // 其实应该在这里判断myTask2是否也退出了,是的话就应该break.但是因为无法在包外得到
  29. // myTask2的状态,所以,这里不能做出是否退出循环的判断.
  30. } else if (strInfo.startsWith("Cancel-2")) {
  31. myTask2.cancel();
  32. } else if (strInfo.startsWith("Cancel-All")) {
  33. // 退出Timer
  34. timer.cancel();
  35. break;
  36. } else {
  37. // 只对myTask1作出判断,偷个懒^_^
  38. myTask1.setInfo(strInfo);
  39. }
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }
  45. static class MyTask extends java.util.TimerTask {
  46. String info = "^_^";
  47. @Override
  48. public void run() {
  49. System.out.println(info);
  50. }
  51. public String getInfo() {
  52. return info;
  53. }
  54. public void setInfo(String info) {
  55. this.info = info;
  56. }
  57. }
  58. }

^_^
myTask-2
^_^
myTask-2
OY // 输入的内容,将替换原有的
OY

myTask-2
OY

myTask-2
OY

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

本版积分规则

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

下载期权论坛手机APP