1

考虑以下工人:

public class Worker implements Callable<String> ....
// initialize context
@Override
public String call() {
    ZMQ.Socket pullSocket = context.socket(ZMQ.PULL);
    pullSocket.connect(HOST_PULL_SOCKET);

    while (!Thread.currentThread().isInterrupted() && !context.isClosed()) {

        String result = pullSocket.recvStr();
        return result;
    }

    return "test";
}

抛出pullSocket.recvStr()如下java.nio.channels.ClosedByInterruptException场景

ExecutorService service = Executors.newFixedThreadPool(4);
List<Worker> workers = new ArrayList<>();
for(int i = 0: i < 4;i++){
    workers.add(new Worker()); // Class where call() is executed
}
String result = service.invokeAny(workers);

被执行。

我怎样才能避免这种异常或者在invokeAny()被调用时处理套接字关闭的首选方法是什么?

4

1 回答 1

0

您收到此异常是因为执行程序已关闭,或者可能在您System.exit()调用的程序的某个位置。一般来说,当 nio chanel 被阻塞的线程被中断时,您会收到此异常。这是停止处理当前任务的信号 - 让任务对此请求负责 - 您可以记录、清除资源并退出任务。据我了解,您不希望您的工作线程被中断-检查您的程序代码-并停止中断。

于 2018-12-07T15:49:50.357 回答