天天看點

如何在servlet中使用多線程,求解???

要求如下:

在一個web Service項目中,使用servlet程式設計,如何防止Tomcat被非正常關閉而導緻伺服器端的servletContext資料丢失?

本人思路如下:

在該項目初始化時,啟動一個線程,每隔一個小時就将servletContext的值存儲到一個txt檔案中核心代碼如下:

public class ServletContextThread extends HttpServlet implements Runnable{

//servletContext的值已先在該工程的其他處設定好了,結構為(name:---:nums,value:---:0),該線程已在初始化時就啟動了

        public void run() {

        }

        public void init() throws ServletException {   

                FileWriter fw = null;

                BufferedWriter bw = null;

                String path = this.getServletContext().getRealPath("recorder.txt");  

                try {

                      while(true){

                               Thread.sleep(60*1000);    

                               String nums = this.getServletContext().getAttribute("nums").toString();  

                               fw = new FileWriter(path);

                               bw = new BufferedWriter(fw);

                               bw.write(nums);

                     }

               } catch (InterruptedException e) {

                         e.printStackTrace();

               } catch (IOException e) {

                         e.printStackTrace();

               }finally{

                          try {

                                    bw.close();

                                     fw.close();

                            } catch (IOException e) {

                                      e.printStackTrace();

                            }

                }

 一直說}

但是它總是說 bw.close();處空指針異常,求解????????????????

2013-9-11 16:51:35 org.apache.catalina.core.ApplicationContext log

嚴重: Servlet servletContextBiz threw unload() exception

javax.servlet.ServletException: Servlet.destroy() for servlet servletContextBiz threw exception

 at org.apache.catalina.core.StandardWrapper.unload(StandardWrapper.java:1401)

 at org.apache.catalina.core.StandardWrapper.stop(StandardWrapper.java:1727)

 at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4488)

 at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1097)

 at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1203)

 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:293)

 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)

 at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1307)

 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571)

 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)

 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560)

 at java.lang.Thread.run(Unknown Source)

Caused by: java.lang.NullPointerException

 at com.lx.biz.servletContextBiz.destroy(servletContextBiz.java:35)

 at org.apache.catalina.core.StandardWrapper.unload(StandardWrapper.java:1382)

 ... 11 more

2013-9-11 16:51:36 org.apache.catalina.core.ApplicationContext log

嚴重: StandardWrapper.Throwable

java.lang.NullPointerException

 at com.lx.biz.ServletContextThread.init(ServletContextThread.java:45)

 at javax.servlet.GenericServlet.init(GenericServlet.java:212)

 at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1161)

 at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981)

 at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4044)

 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4350)

 at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1105)

 at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1203)

 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:293)

 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)

 at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1307)

 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571)

 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)

 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560)

 at java.lang.Thread.run(Unknown Source)

2013-9-11 16:51:36 org.apache.catalina.core.StandardContext loadOnStartup

嚴重: Servlet /counter threw load() exception

java.lang.NullPointerException

 at com.lx.biz.ServletContextThread.init(ServletContextThread.java:45)

 at javax.servlet.GenericServlet.init(GenericServlet.java:212)

 at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1161)

 at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981)

 at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4044)

 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4350)

 at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1105)

 at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1203)

 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:293)

 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)

 at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1307)

 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571)

 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)

 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560)

 at java.lang.Thread.run(Unknown Source)