Servlet 後臺線程啓動

剛開始學java,做javaweb開發,想在後臺服務開啓時候後臺跑一個線程做些清理工作,到網上看了幾篇博客,自己整了整,寫出點東西來。現在用博客記錄下來。

java開發新手,歡迎吐槽。


以下demo寫的是在服務啓動的時候,給servletContext中的一個list集合添加數據。當然,這個集合不是線程安全的,只是簡單的demo。


代碼如下:


package com.test.servlet;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class StartThreadListener implements ServletContextListener {

	private MyThread myThread = null;
	
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("end-----------");
		if (myThread != null && myThread.isInterrupted()) {  
            myThread.interrupt(); 
        } 
		
	}

	@Override
	public void contextInitialized(ServletContextEvent event) {
		ServletContext context = event.getServletContext();
		List<String> list = new ArrayList<String>();
		context.setAttribute("token", list);

		System.out.println("start-----------");
        if (myThread == null) {  
            myThread = new MyThread(context);  
        }
        myThread.start(); // servlet 上下文初始化時啓動  
		
	}

}

//自定義線程
class MyThread extends Thread{

	private ServletContext context = null;
	
	public MyThread(ServletContext context) {
		super();
		this.context = context;
	}


	@Override
	public void run() {
		while (!this.isInterrupted()) {// 線程未中斷執行循環  
            try {  
            	@SuppressWarnings("unchecked")
				List<String> list = (List<String>) this.context.getAttribute("token");
            	list.add("abcd");
            	System.out.println(list);
            	System.out.println("list size = "+list.size());
                Thread.sleep(4000); //每隔2000ms執行一次  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }
        }  
	}
	
}


然後再web.xml中配置如下:

<listener>  
    <listener-class>com.test.servlet.StartThreadListener</listener-class>  
</listener>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章