【问题标题】:Stop a Thread that waits for a long period停止等待很长时间的线程
【发布时间】:2015-11-04 22:27:29
【问题描述】:

我在终止等待accept() 调用的线程时遇到问题。

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

我有实现Runnable 接口的GestorBuzon

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();
            }
        }
    }    
} 

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

它必须这样做:

【问题讨论】:

  • 你能中断你的线程以阻止它们在accept()上等待吗?
  • 这个 Runnable 类是一个连接监听器,当我不想做更多 accept() (来自客户端的连接)时,我使用 contextDestroyed() 。我不知道其他形式可以正确终止它。
  • gestorBuzon.terminate()之后调用thread.interrupt()
  • @AndyTurner java.net 的方法不可中断。
  • Thread.destroy() 已弃用。

标签: java multithreading sockets


【解决方案1】:

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

【讨论】:

  • 问题是我需要对服务器进行"X"个连接,我不知道这个数字,然后我必须停止线程。
  • 所以当你到达 X 时清除你的running 标志并按照上面的方法继续。
  • 设置一个在线程关闭前你愿意等待的最长的超时时间。如果线程没有被关闭,只需再次调用accept。或者,不要设置超时。要关闭,请设置“关闭”标志,然后通过自己建立连接来强制 accept 解除阻止。
  • @MarioNavarroClaras 你不能那样做。当另一个线程正在或可能正在使用它时,您不能在一个线程中释放资源。如果其他线程已经调用了accept,但还没有阻塞,结果是不可预知的。 (或者如果其他线程在close 操作正在进行时调用accept。)
  • 其他人与您联系的方式相同。您创建一个套接字并调用connect
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
相关资源
最近更新 更多