Java中计时器的用法

利用计时器实现对象状态检测

当对象在创建后,每隔一定的时间需要变化一次状态,并且该状态的变化还要通知到用户,可以利用Java的计时器实现对对象状态变化的监测。

举个例子,如种植了一颗植物,植物每隔两分钟需要变化一次状态,让后根据状态的不同通知客户端进行响应的事件处理。

植物生长状态

生长时间

客户端的处理

种子

分钟

显示植物的幼苗状态

幼苗

分钟

显示植物的成年状态

成熟

分钟

显示植物的成熟状态

收获

5分钟

提示用户收获该作物

articleID :植物ID 

roleID:所属角色ID 

currentState:植物的当前状态 

timer:生长剩余时间

Java中计时器的用法:

(1)Timer.schedule(TimerTask task,Date time)安排在制定的时间执行指定的任务。
(2)Timer.schedule(TimerTask task,Date firstTime ,long period)安排指定的任务在指定的时间开始进行重复的固定延迟执行.
(3)Timer.schedule(TimerTask task,long delay)安排在指定延迟后执行指定的任务.
(4)Timer.schedule(TimerTask task,long delay,long period)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行.
(5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)安排指定的任务在指定的时间开始进行重复的固定速率执行.
(6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long period)安排指定的任务在指定的延迟后开始进行重复的固定速率执行.

实现的源码:

import java.util.HashMap;

import java.util.LinkedList;

import java.util.Timer;

import java.util.TimerTask;

import org.apache.mina.common.IoSession;

import com.toplx.mina.bussiness.handler.utils.ClientInforUtils;

public class Sacnning {

public static Boolean running = false;

public static void scanningProduct() {

Timer time = new Timer();

long delay = 50;

long period = 100;

// 开始执行计划任务

time.schedule(new TimerTask() {

// 检测服务器的控制流程

int k = 0;

public void run() {

System.out.println("开始打印   " + k + " 次");

k++;

running = true;

LinkedList<Product> list = ProductList.productList;

System.out.println("   植物生长的链表长度为  " + list.size());

int size = list.size();

for (int i = 0; i < size; i++) {

Product product = list.getFirst();

Integer tempTime = product.getTimer();

System.out.println("   tempTime  " + tempTime);

// 改变作物的时间

if (tempTime > 0) {

tempTime--;

product.setTimer(tempTime);

list.removeFirst();

list.addLast(product);

System.out.println("    已经减--");

System.out.println("    植物的当前状态  "+product.getCurrentState());

} else {

System.out.println("   向客户端发送植物生长状态");

Integer currentState = product.getCurrentState();

IoSession session = ClientInforUtils.getSessionByID

.get(product.getRoleID());

System.out.println("--------------------"+product.getRoleID());

System.out.println("--------------------"+session);

switch (currentState) {

case 1:

product.setCurrentState(2);

product.setTimer(30);

list.addLast(product);

list.removeFirst();

notifyClient(session, product.getArticleID(),

product.getCurrentState());

break;

case 2:

product.setCurrentState(3);

product.setTimer(30);

list.addLast(product);

list.removeFirst();

notifyClient(session, product.getArticleID(),

product.getCurrentState());

break;

case 3:

product.setCurrentState(4);

product.setTimer(30);

list.addLast(product);

list.removeFirst();

notifyClient(session, product.getArticleID(),

product.getCurrentState());

break;

case 4:

product.setCurrentState(5);

product.setTimer(30);

list.addLast(product);

list.removeFirst();

notifyClient(session, product.getArticleID(),

product.getCurrentState());

break;

case 5:

product.setCurrentState(6);

product.setTimer(30);

list.addLast(product);

list.removeFirst();

notifyClient(session, product.getArticleID(),

product.getCurrentState());

break;

case 6:

product.setCurrentState(1);

product.setTimer(30);

list.addLast(product);

list.removeFirst();

notifyClient(session, product.getArticleID(),

product.getCurrentState());

break;

default:

break;

}

}

}

}

}, delay, period);

}

public static void notifyClient(IoSession session, Integer articleID,

Integer state) {

HashMap<String, Object> map;

switch (state) {

case 1:

map = new HashMap<String, Object>();

map.put("Event", "S_Product_Grow");

map.put("productID", articleID);

map.put("state", state);

session.write(map);

break;

case 2:

map = new HashMap<String, Object>();

map.put("Event", "S_Product_Grow");

map.put("productID", articleID);

map.put("state", state);

System.out.println("   客户端地址  "+session);

session.write(map);

break;

case 3:

map = new HashMap<String, Object>();

map.put("Event", "S_Product_Grow");

map.put("productID", articleID);

map.put("state", state);

session.write(map);

break;

case 4:

map = new HashMap<String, Object>();

map.put("Event", "S_Product_Grow");

map.put("productID", articleID);

map.put("state", state);

session.write(map);

break;

case 5:

map = new HashMap<String, Object>();

map.put("Event", "S_Product_Grow");

map.put("productID", articleID);

map.put("state", state);

session.write(map);

break;

case 6:

map = new HashMap<String, Object>();

map.put("Event", "S_Product_Grow");

map.put("productID", articleID);

map.put("state", state);

session.write(map);

break;

default:

break;

}

}

}

package com.toplx.mina.bussiness.handler.allhandlers.product.utils;

public class Product {

private Integer articleID;

private Integer roleID;

private Integer currentState;

private Integer timer;

public Product(Integer articleID, Integer roleID) {

this.articleID = articleID;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java有两种常用的计时器:Timer和ScheduledExecutorService。 Timer是一个简单的计时器,可以安排一个任务在指定的时间间隔后执行,也可以安排一个任务在指定的时间点执行。但是,Timer存在一些问题,如任务执行时间长会影响后续任务的执行时间,任务抛出未捕获异常会导致整个计时器停止工作等。 ScheduledExecutorService是Java 5引入的计时器,它解决了Timer存在的一些问题。ScheduledExecutorService可以安排一个任务在指定的时间间隔后执行,也可以安排一个任务在指定的时间点执行。与Timer不同的是,ScheduledExecutorService采用线程池来执行任务,任务执行时间长不会影响后续任务的执行时间,任务抛出未捕获异常不会导致整个计时器停止工作。 下面是一个使用ScheduledExecutorService实现的计时器示例: ```java import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class TimerDemo { public static void main(String[] args) { ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("Hello, world!"); } }, 0, 1, TimeUnit.SECONDS); } } ``` 该示例创建了一个ScheduledExecutorService实例,并安排一个任务每隔1秒钟输出一次"Hello, world!"。scheduleAtFixedRate方法的第一个参数是需要执行的任务,第二个参数是初始延迟时间,第三个参数是任务执行间隔时间,第四个参数是时间单位。这里使用了Executors工厂类创建了一个线程池,线程池只有一个线程,因为只需要执行一个任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值