关于WEB控制线程的,写了个测试程序,服务器用RESIN,正常过程是:当客户端发出一个线程开始的动作时,线程正常运行,当客户端发出一个线程停止的动作时,线程结束;
现在的问题是,当客户端发出一个线程开始的动作时,线程正常运行,但在这个时候更改了别的javabean,服务器会自动加载javabean,并似乎清空了内存,这时候再从客户端发出一个停止线程的动作时,线程无法停止,怎么解决这个问题?? 另外一个帖子:http://community.csdn.net/Expert/TopicView.asp?id=5202091

解决方案 »

  1.   

    根据楼主的描述,线程信息似乎保存在静态成员内。一旦重新加载 bean,静态成员自然也就没了。解决的办法,可能需要楼主自己控制 ClassLoader。不知道 RESIN 当中有无这样的配置,WebLogic 里面有,但我没用过。
      

  2.   

    看了你的代码.
    你每次都new一个新的线程,这样当然达不到你要的效果。。
    如果用单态,好像也不满足你的要求。
    你把new的线程放到session中看看可以不?
    从session中取线程,取不到就new一个
      

  3.   

    或者自己用一个静态的hashmap来实现,将sessionId作为key,把线程丢进去
      

  4.   

    to 机枪兵,自己控制ClassLoader,RESIN里面好象没这样的配置,我查查资料。。
    to piaopiao11,session中怎么放??如果放到session中我还是想象不出怎么才能放到session中,session是跟随每个用户生成的,服务器中的线程是所有用户的。。
    up
      

  5.   

    为什么不用ServletContext呢,它是环境context,不会跟随bean的消亡而消亡的.而且像你现在遇到的问题最好能够在ServletContext里做存储.
    servletContext.setAttribute("ThreadName",thread);多方便,比session要安全多了
      

  6.   

    application确实不会随着session或bean小时而小时,但当重新加载了bean之后,application中的内容访问不到了
    是application.setAttribute("ThreadName",new SQLApplication().start());???
      

  7.   

    不明白为什么lz这么执着j2ee的东西一定要按照j2ee的表中来走,不论是tomcat\weblogic还是RESIN都是j2ee的容器,这样的问题最好能够采用和容器无关的方法解决。所以类似于classLoader就不要考虑了用static的map也可以,不过不是最好的解决办法。你说的application我不是很明白。既然是servlet,为什么不用ServletContext呢?还要那么辛苦去折腾别的东西。不解
      

  8.   

    用个线程池, 线程就是一个单列对象,里边放很多的线程,它本身就是一个应用,和web无关.
      

  9.   

    ServletContext
    你可以通过ListenerServlet来实现
    public void contextInitialized(ServletContextEvent sce) {
        //得到并传输context
        m_context = sce.getServletContext();
    //将ThreadManager放到环紧中
    m_context.setAttribute("ThreadManager",threadManager);
    lz这样的问题,包括可能遇到的数据库处理,都属于有状态模块,而web框架是无状态的,干嘛那么牵强的去做呢?直接用ListenerServlet,它就是用来处理有状态的需求的,多好。j2ee一定要先弄懂servlet
      

  10.   

    我试试你的方法。。threadManager不知道行不行。。
    主要是有这样的需要,因为下载这个工作可以提交给服务器去做,用户只需要发出下载的需求就可以退出,后台的线程完成了工作之后,用户下次来时可以看到结果,这就是为什么一定需要WEB控制线程
    还有另外一种需求,就是为了避免频繁的数据操作,而把用户所需要的请求缓存到内存中,而更新数据的工作可以由线程来定时完成,控制线程的工作可以直接WEB查看、中断。
      

  11.   

    这里的threadManager是你自己的一个类,用来管理保存用户操作的。只是借助ServletContext来存储。
    如果你以前没有用过ListenerServlet的话,趁这个机会好好学学吧,纯粹的web服务能够解决的问题太有限了,而ListenerServlet对有状态的服务很起作用的。