剛開始學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>