一个服务器的程序,开始运行后,不知道如何让其结束
class ServerSubThread extends Thread {
    public void run() { //启动线程的入口方法
         hsd.startProvidingService();  //服务器将出于监听状态,此函数内部会产生新的线程。hsd是一个类的对象。
      }
  }我也尝试过网上的方法设置一个符号变量,在run方法中设置while循环,当结束时设置符号变量为假。
但是程序执行到startProvidingService()时,程序出于监听状态,不会继续向下执行,这个ServerSubThread线程会一直停留在startProvidingService()语句处,所以我认为这个方法行不通。我想把ServerSubThread线程和startProvidingService()内部产生的线程全部结束掉,请问大家有没有什么合适的办法?
多谢大家!

解决方案 »

  1.   

    想把ServerSubThread线程和startProvidingService()内部产生的线程全部结束掉可以用interrupt()
    ServerSubThread sst = new ServerSubThread ();
    sst.start();
    sst.interrupt();
    但是这种方法不是很提倡 呵呵
      

  2.   

    多谢两位,请问还有别的办法吗?为什么用interrupt,我试了下,线程没有被停止,是不是还有别的限制条件,谢谢大家!
      

  3.   

    就如楼主所说设置一个flag标志吧。
    flag设置的方法可以考虑下。
    其它的方法还不知道。
      

  4.   

    我是sst.start()和sst.interrupt() 分别在两个函数中调用
    public start(){
          sst.start();
    }
    public stop(){
          sst.interrupt();
    }
    没有起到效果,当stop函数执行后,服务器仍能相应来自客户端的连接。
    我做了个界面,有个"stop service"按钮,点击后,事件响应,执行stop函数,想法是让服务器停止工作,把服务器的线程全部结束掉。
    谢谢大家!
      

  5.   

    我想结束ServerSubThread线程和其内部产生的新的所有线程。谢谢大家!
      

  6.   

    最好通过flg来停止线程,
    大致情况如下:
    while(flg){...
    }然后写个方法来设置flg的值
    stop()
    {
    flg = false;
    }
    其他的方法不推荐。
      

  7.   

    回复7楼:
    我漏写了,是 public void start(){} 漏写了void。
    http://topic.csdn.net/t/20060918/16/5030127.html 说interrupt后也没有停止运行。
    我试着调用sst.stop()方法,效果不理想。
    你再帮我看看,谢谢了!
      

  8.   

    你不能interrupt正在试图获取synchronized或者是正在进行io操作的线程,看看能不能换成nio包里的类去操作。如果你是进行stock通信就用StockChannel
      

  9.   

    回复10楼:
    谢谢了先!
    我认为是这样,因为hsd.startProvidingService() 会出于监听状态,所以在while第一次执行时,程序会停在此处,以至于通过stop把flag设为假时,第一次while也没有执行完,所以通过设为假,没有起到效果。
    class ServerSubThread extends Thread {
        public void run() { //启动线程的入口方法
             while(flag){
             hsd.startProvidingService();  // 程序会停于此处,监听,不会往下执行       
            }
          }
      }
      

  10.   

    我使用的是工具包,它底层写的比较复杂,我把函数写一下,省略了一些与问题无关的语句,方便大家帮我:
     public void startProvidingService() {
        ServerSocket ss = null;
        ss = new ServerSocket(this.port);
        ..................................
        Processor processor = null;
        processor = hl7server.accept(null); //一直等待来自客户端的连接,只有连接上后,才会向下执行
        hl7server.start(null);              //连接上后,开始运行,等待客户端需求,并服务
      }
    我想停止ServerSubThread线程,并把它调用startProvidingService函数内部accept和start产生的线程一并停止。谢谢大家!
      

  11.   

    中断线程,你需要显式的关闭socket通信。
      

  12.   

    谢谢楼上!
    怎么显示关闭socket通信?我不会,请指教,谢谢了!
      

  13.   

    每一个Socket存在时,都将占用一定的资源,在Socket对象使用完毕时,要其关闭。关闭Socket可以调用Socket的Close()方法。在关闭Socket之前,应将与Socket相关的所有的输入/输出流全部关闭,以释放所有的资源。而且要注意关闭的顺序,与Socket相关的所有的输入/输出该首先关闭,然后再关闭Socket。
      os.close();
      is.close();
      socket.close();
    如果你是用别人封装好的包,看看人家的api。一定有关闭的操作。