场景是这样的,现在有一个Web应用程序安装在服务器上(WebSphere Application Server)之后,然后这个应用中启动了一个线程,在后台运行一个任务,现在我除了关闭服务器之外,请问还有什么办法能够很方便的停止这个线程?或者说如何去管理这些线程呢?

解决方案 »

  1.   

    不熟1. 该线程没有自己结束的条件么?
    2. 能设置为daemon类型的么?
      

  2.   

    你可以在前台中设置一个循环,然后循环监听socket来连接,如果与了连接,就新建一个后台线程,然后让后台线程工作,你的前台线程继续循环等待socket的连接。后台线程运行完了就完了,而前台线程你可以传一个标签值给他,让他得到这个标签值(boolean)时就循环,给你看段代码:
    package server;import java.io.FileInputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Properties;/**
     * 服务器端口类
     *  2009-12-8  
     * @Team 永不放弃小组[Never Give Up Team]
     * @version 1.0
     * @since JDK1.6(建议) 
     * @author WangPeihu
     *
     */
    public class DMSServer extends Thread{
        private int port;
        private Socket socket ;
        private static ServerSocket ss;
        public boolean flag = true;
        private FileInputStream fis;    /**
         *@开启端口
         */
        public void initSocket() {
         try {
        fis = new FileInputStream("db.properties");
        Properties p = new   Properties();
        p.load(fis);
        port = Integer.parseInt(p.getProperty("port"));
        ss = new ServerSocket(port);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
                fis.close();
    } catch (Exception e) {
    System.out.println(e.getMessage());
    }
    }
    } /**
     * @打开服务端
     */

    public void start() {
    try{
    initSocket();
    while (flag) {
    socket = ss.accept();  //阻塞于此
    System.out.println("建立一个用户连接....." + socket.getInetAddress());
    Thread t = new Thread(new DMSServerThread(socket));
    t.start();
    }
    }catch(Exception e){
    System.out.println("服务器断连接失败......");
    }finally{
    shutDown();
    }
    }

    /**
     *@关闭服务端
     */
    public void shutDown() {
    try {
    ss.close();
    } catch (Exception e) {
    try {
                            ss.close();
                            } catch (Exception e1) {
                            e1.printStackTrace();
                            }
    System.out.println("服务器异常关闭");
    }
    } public boolean isFlag() {
    return flag;
    } public void setFlag(boolean flag) {
    this.flag = flag;
    }
    }
      

  3.   

    你在你启动的这个线程里面定义一个关闭线程的方法,这个方法一般是设置标志位为true或者false,在线程的run方法的循环中判断这个标志位,如果true线程继续执行否则就停止。然后你要想在别的类控制这个线程,你得到这个线程对象,在用对象调用关闭方法不就行了吗?
      

  4.   

    如果你的应用程序是WEB应用程序的话,就应该使用SERVLET的ServletContextListener接口,该接口需要实现二个方法:
    void contextDestroyed(ServletContextEvent event);
    void contextInitialized(ServletContextEvent event);
    在WEB应用程序启动的时候会自动调用contextInitialized方法,你可以在这个方法中启动一个线程,并且持有这个线程的实例句柄,在WEB应用程序关闭的时候会自动调用contextDestroyed方法,你应该在该方法中调用线程实例句柄的interrupt()方法。如果你的线程中存在无法interrupt的实现,例如:IO、SOCKET,则需要自己设置GUARD变量进行线程的控制。另外,该类需要在web.xml文件中进行配置:
    <listener>
    <listener-class>com.sand.core.listener.WebApplicationContextListener</listener-class>
    </listener>