MVP 模式编写刷新 Web Session 会话实例小Demo,实战代码,清晰明了,维护简单

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jspping/article/details/48263347

上星期一个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,不过他说挺管用的,我就没继续优化了,写出只是分享一下编程思维,因为每个人的思维不一样,有的你觉

得很不错就可以学习临摹,不好的可以指正,这样就促进了大家的编码能力了

阅读更多

没有更多推荐了,返回首页