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

解决方案 »

  1.   

    线程用一个单态类来管理就好了。
    interface MyThread{
        public String getId();
        public void start();
        public void stop();
    }
    public ThreadM {
       private static ThreadM instand = new ThreadM ();
       private Map <String , MyThread>threadMap = new ()HashMap <String , MyThread>();
       private ThreadM (){//
       }   public static ThreadM getInstant(){
           return instand ;
       }   public void putThread(MyThread mt){
           threadMap.put(mt.getId(), mt);
       }   public MyThread getThread(String id){
           return threadMap.get(id);
       }
    }大概的意思,这个更多细节请找设计模式的资料。
      

  2.   

    如果对模式要求不高的话事实上也可以放进application,这个的周期可以达到服务器关闭为止,用法和session差不多,只不过一个是有用户运行期有关,一个则是可看成是全局对象。
      

  3.   

    楼上的代码看不明白,放入application试过了,仍然无法解决,中途改变了JAVABEAN后,RESIN清空了内存,但似乎JAVABEAN的内存它并没清空,我的测试代码如下:javabean部分=========================SQLApplication.javapublic class SQLApplication extends Thread {
        public static volatile boolean isStop = true;    public void run() {
            System.out.println("线程开始");
            while (!isStop) {
                System.out.print(this.getName());
                System.out.print("  ");
                System.out.println(System.currentTimeMillis());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }        System.out.println("线程结束");
        }    public void tt(String soso, ServletContext application) {
            if (null == application.getAttribute(soso)) {
                application.setAttribute(soso,"start");
                sql(soso, application, true);
                if (!this.isInterrupted()) {
                    isStop = false;
                    this.start();//启动更新数据线程
                    System.out.println("启动线程,当前线程状态:" + this.isInterrupted());
                }
            }
        }
    }JSP控制部分======================test.jsp:<a href="?action=stopthread">停止线程</a>
    <a href="?action=startthread">开始线程</a>
    <%
        String action = request.getParameter("action");
        if (null != action && action.equals("stopthread")) {
            SQLApplication.isStop = true;
            out.println("操作结束");
            return;
        }
        if (null != action && action.equals("startthread")) {
            SQLApplication s = new SQLApplication();
            if (!s.isInterrupted()) {
                SQLApplication.isStop = false;
                s.start();
            }
            out.println("操作结束");
            return;
        }
        SQLApplication s = new SQLApplication();
        s.tt("aaa", application);
    %>
    帮忙看看,怎么解决RESIN自动加载某个类或加载win.xml后无法再停止线程的问题
      

  4.   

    sql(soso, application, true);这行请注释掉就可以正常运行了。。
    问题怎么解决??????请大家帮帮忙忙
      

  5.   

    据我所致没有办法处理,当你修改了javabean后,resin会初始化servlet,所有内存清空。一般业务是不会这样做。
      

  6.   

    不可能吧那这么说WEB无法控制线程了??????
      

  7.   

    我想让WEB控制线程,就是简单的在IE上点一下鼠标,让线程开始down文件,它就down,让它stop,它就顺利stop....
      

  8.   

    用ServletContext来存储线程
    ServletContext是换进context,不会随着session或者bean消失而消失。而且你这种情况用ServletContext来保存线程信息最好,本来j2ee环境给你提供这个context就是来存储这些信息的
      

  9.   

    线程放到application里????怎么放???
    up
      

  10.   

    application确实不会随着session或bean小时而小时,但当重新加载了bean之后,application中的内容访问不到了up