Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法关闭线程池_Java_Multithreading_Sockets - Fatal编程技术网

Java 无法关闭线程池

Java 无法关闭线程池,java,multithreading,sockets,Java,Multithreading,Sockets,我想在countDownLatch.getCount()为零时关闭服务器,但它不是关闭,而是等待接受套接字连接。以下是处理传入TCP请求的服务器代码 public static void start(File configFile, ReplyListener replyListener, CountDownLatch countDownLatch) { try { Server.init(configFile);

我想在
countDownLatch.getCount()
为零时关闭服务器,但它不是关闭,而是等待接受套接字连接。以下是处理传入TCP请求的服务器代码

public static void start(File configFile, ReplyListener replyListener, CountDownLatch countDownLatch) {
            try {
                Server.init(configFile);
                while (countDownLatch.getCount() != 0) {
                    //try {
                        Server.socket = serverSocket.accept();
                        Message message = new Message();
                        message.setSocket(Server.socket);
                        Server.pool.submit(new ServerTaskCallable(message.receive()).setReplyListener(replyListener));
                    /*} catch (SocketTimeoutException e){
                        System.out.println("Finished testing");
                    }*/
                }
                Server.socket.close();
                serverSocket.close();
                Server.pool.shutdownNow();
            } catch (IOException e) {
                logger.error("Cannot start a server. The server thread will be terminated. Exception: ", e);
                System.exit(0);
            }
        }
这是线程dum:

"pool-1-thread-1@651" prio=5 tid=0xe nid=NA runnable
  java.lang.Thread.State: RUNNABLE
      at java.net.PlainSocketImpl.socketAccept(PlainSocketImpl.java:-1)
      at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:404)
      at java.net.ServerSocket.implAccept(ServerSocket.java:545)
      at java.net.ServerSocket.accept(ServerSocket.java:513)
      at model.server.Server.start(Server.java:42)
      at model.MainTest.lambda$main$3(MainTest.java:30)
      at model.MainTest$$Lambda$2.2012232625.run(Unknown Source:-1)
      at java.lang.Thread.run(Thread.java:745)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      at java.lang.Thread.run(Thread.java:745)

"pool-3-thread-1@1142" prio=5 tid=0x12 nid=NA waiting
  java.lang.Thread.State: WAITING
      at sun.misc.Unsafe.park(Unsafe.java:-1)
      at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
      at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
      at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
      at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      at java.lang.Thread.run(Thread.java:745)
如何正确终止服务器线程池?

您有两个选项:

  • 通过在
    服务器套接字上设置超时。这将导致每次超时时,
    accept()
    抛出一个
    SocketTimeoutException
    。您需要捕获循环中的异常,以确保服务器一直在侦听连接:

    while(countDownLatch.getCount() != 0) {
        try {
            socket = serverSocket.accept();
        } catch(SocketTimeoutException e) {
          //timeout occurred!
        }
    }
    
  • 从其他线程关闭
    ServerSocket
    via。这将抛出一个
    socketaccept
    ,终止
    accept()
    调用。可以在循环之外捕获此异常,以便轻松退出“侦听连接”行为


  • 您是否使用了
    ServerSocket
    ?它有助于终止线程池,但我希望避免使用timeOut()(当然,如果可行的话)。我只能想到两个选项,第一个选项是超时,如前所述,本质上是每隔一段时间强制代码通过循环。第二个是中断某个主线程发出的接受调用。明白你的意思了吗。但是,我想知道,为什么countdownLatch的解决方案不起作用?您不能通过
    Thread\interrupt()
    中断
    accept()
    调用(因为它不会抛出
    interruptedeException
    ,因此无处处理中断),尽管您可以
    关闭()
    来自另一个线程的
    ServerSocket
    ,该线程应中断accept