利用计时器实现 对象状态 的 检测
当对象在创建后,每隔一定的时间需要变化一次状态,并且该状态的变化还要通知到用户,可以利用Java的计时器实现对对象状态变化的监测。
举个例子,如种植了一颗植物,植物每隔两分钟需要变化一次状态,让后根据状态的不同通知客户端进行响应的事件处理。
植物生长状态 |
生长时间 |
客户端的处理 |
种子 |
2 分钟 |
显示植物的幼苗状态 |
幼苗 |
3 分钟 |
显示植物的成年状态 |
成熟 |
4 分钟 |
显示植物的成熟状态 |
收获 |
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;
<span s
发表评论
评论