上星期一个Java Web 的朋友问我有什么好的方式可以定时刷新 Web 会话,并且保持性能什么的完美运行,我想程序放在服务
器被编译的时候,已经通过函数入口 Main 启动程序,而我们只需要在相关的入口函数编写我们需要的一些操作逻辑即可,为
了方便避免大中型项目模块化开发的维护难度和代码的可读性高,推荐类似与MVP这样的模式来编写代码,这在后期开发和维
护将大幅提升我们的工作效率还有程序性能,下面看看代码结构
入口函数即主类:
package engineer.jsp.alarm.service;
import java.util.Timer;
import engineer.jsp.alarm.listener.AlarmCTimeListener;
import engineer.jsp.alarm.mtimer.AlarmTimerTask;
public class MainServiceLaunch{
private static Timer mTimer;
private static AlarmTimerTask mAlarmTimerTask;
public static void main(String[] args) {
initAlarmService();
}
private static void initAlarmService(){
mTimer = new Timer();
mAlarmTimerTask = new AlarmTimerTask();
mAlarmTimerTask.setOnAlarmCTimeListener(mAlarmCTimeListener);
mTimer.scheduleAtFixedRate(mAlarmTimerTask, 0, 10*1000);// 60*60*1000
}
private static AlarmCTimeListener mAlarmCTimeListener = new AlarmCTimeListener(){
public void onStart() {
System.out.println("AlarmTimerTask Running ...");
}
public void onStop() {
System.out.println("AlarmTimerTask Object is Cancel ...");
}
};
}
通过主类函数入口,调动 initAlarmService() ,初始化一个Timer对象以及自定义定时器AlarmTimerTask对象并且设置定时器自定义类的开
始状态和销毁实例的操作自定义接口,实现这个接口,在主类得到状态进行其他可需要的操作等,scheduleAtFixedRate 函数开启定时操作
自定义接口类:
package engineer.jsp.alarm.listener;
public interface AlarmCTimeListener {
public void onStart();
public void onStop();
}
自定义定时器处理类:
package engineer.jsp.alarm.mtimer;
import java.util.TimerTask;
import engineer.jsp.alarm.listener.AlarmCTimeListener;
import engineer.jsp.alarm.mthread.AlarmThread;
public class AlarmTimerTask extends TimerTask{
private AlarmCTimeListener mAlarmCTimeListener;
public void setOnAlarmCTimeListener(AlarmCTimeListener l){
mAlarmCTimeListener = l;
}
@Override
public void run() {
if(mAlarmCTimeListener!=null)
mAlarmCTimeListener.onStart();
if(AlarmThread.getInstance()==null)
AlarmThread.getThreadInstance().start();
else
AlarmThread.getThreadInstance().setAlarmState(true);
}
public void onStop(){
this.cancel();
if(mAlarmCTimeListener!=null)
mAlarmCTimeListener.onStop();
}
}
在这里根据主类定时器对象的 scheduleAtFixedRate 函数设置的间隔定时执行 run 里面的任务处理,采用单例模式创建自定
义 synchronized 线程 AlarmThread 来控制访问和访问操作
synchronized 线程 AlarmThread :
package engineer.jsp.alarm.mthread;
public class AlarmThread extends Thread{
private static AlarmThread mThreadInstance = null;
private boolean isAlarmStart = true;
public synchronized static AlarmThread getThreadInstance() {
if (mThreadInstance == null) {
mThreadInstance = new AlarmThread();
}
return mThreadInstance;
}
public synchronized static AlarmThread getInstance(){
return mThreadInstance;
}
public synchronized void onThreadPause(){
try {
this.wait();
} catch (InterruptedException e) {
}
}
public synchronized void onThreadResume(){
this.notify();
}
public void setAlarmState(boolean b){
this.isAlarmStart = b;
System.out.println("isAlarmStart boolean "+isAlarmStart);
if(isAlarmStart)
onThreadResume();
}
@Override
public void run() {
synchronized (mThreadInstance) {
while(true){
if(isAlarmStart){
// Need You Running Method , Refrush Session
System.out.println("AlarmThread Start ...");
isAlarmStart = false;
}else{
System.out.println("AlarmThread Pause ...");
onThreadPause();
}
}
}
}
}
自定义线程采用synchronized来同步单例实例对象,在需要访问的时候可在注释处编写需要处理的方法,不需要访问的时候,我们为了避免
服务器的资源不必要浪费和资源处理,我们通过实例来暂停它本身,停止工作,需要继续执行访问的时候,我们在通过实例来唤醒本身并且
开始继续工作
这就是大致的简单逻辑小Demo,不过他说挺管用的,我就没继续优化了,写出只是分享一下编程思维,因为每个人的思维不一样,有的你觉
得很不错就可以学习临摹,不好的可以指正,这样就促进了大家的编码能力了