停止等待很长时间的线程

时间:2015-11-04 22:27:29

标签: java multithreading sockets

我遇到了终止等待accept()电话的线程的问题。

accept():侦听与此套接字的连接并接受它。该方法将阻塞,直到建立连接。

我有GestorBuzon实现Runnable接口:

public class GestorBuzon implements Runnable{

   private static volatile boolean running = true;

   public void run() {
       try {
           while (running) {
               -- pre code
               accept();
               -- post code
           }
       } catch(IOException e) {
             terminate();
       } 
   }

   public static void terminate() {
       running = false;
   }
}

我有MessageSystem类来启动和停止线程:

public class MessageSystem {

    private GestorBuzon gestorBuzon;
    private Thread thread;

    public MessageSystem() {
        // Starts the Thread
        contextInitialized();
    }

    private void contextInitialized() {
        gestorBuzon = new GestorBuzon();
        thread = new Thread(gestorBuzon);
        thread.start();
    }

    private void contextDestroyed() {
        if (thread != null) {
            gestorBuzon.terminate();
            try {
                thread.join();
            } catch (InterruptedException e) {
                gestorBuzon.terminate();
            }
        }
    }    
} 

我多次调用accept()类中的Runnable函数,但是当我使用contextDestroyed()函数时,线程仍在等待accept()并且线程不会终止。我做错了什么?

必须这样做: enter image description here

1 个答案:

答案 0 :(得分:1)

只需通过ServerSocketsetSoTimeout()上设置套接字超时,并在其触发时捕获SocketTimeoutException。然后,您可以检查running块中的catch标志等,并决定是继续还是停止接受。