Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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_Concurrency_Guava_Completable Future - Fatal编程技术网

Java 可侦听的未来回调严重延迟

Java 可侦听的未来回调严重延迟,java,multithreading,concurrency,guava,completable-future,Java,Multithreading,Concurrency,Guava,Completable Future,我对番石榴可上市期货的回调被推迟了。我正在编写一个应用程序,它基本上有一个线程池,一旦“长时间运行任务”完成,就会有一个成功回调,如下所示: ListenableFuture<Boolean> listenableFuture = service.submit(() -> publish(eventName, record, producer)); Futures.addCallback(listenableFuture, new Fut

我对番石榴可上市期货的回调被推迟了。我正在编写一个应用程序,它基本上有一个线程池,一旦“长时间运行任务”完成,就会有一个成功回调,如下所示:

          ListenableFuture<Boolean> listenableFuture = service.submit(() -> publish(eventName, record, producer));
          Futures.addCallback(listenableFuture, new FutureCallback<>() {
            @Override
            public void onSuccess(Boolean result) {
              System.out
                  .println(LocalTime.now() + " Task completed successfully with result: " + result);
            }

            @Override
            public void onFailure(Throwable t) {
              System.out.println(LocalTime.now() + " Task failed with result: " + t.getMessage());
            }
          }, service);
问题
如果我将threadpool设置为处理1MM的事情,我将看到1MM
网络请求成功
,然后我会看到一个回调println语句被触发。为什么会出现这种情况?

for Futures.addCallback声明,回调在执行器中运行。只有在所有其他排队元素完成后,才会运行回调。要解决此问题,您可以创建一个单独的执行器来执行回调,或者因为您似乎控制了池构造函数,所以可以创建一个而不是LinkedBlockingQueue作为任务队列,并对回调进行优先级排序。

for Futures.addCallback状态为,回调在执行器中运行。只有在所有其他排队元素完成后,才会运行回调。要解决这个问题,您可以创建一个单独的执行器来执行回调,或者因为您似乎控制了池构造函数,所以您可以创建一个而不是LinkedBlockingQueue作为任务队列,并对回调进行优先级排序。

回调不是在同一个执行器上运行的,因此,它们将在实际网络请求任务之后排队?恐怕只是一点猜测。这是什么?1万亿?@AlexeiKaigorodov——100万(1000万)的另一种说法——为什么不100万或1万?类似于“如何修复”的问题应该形成完整的可编译和可执行代码片段。否则,r\n问题可能隐藏在代码的缺失部分,并且我们无法修复它。回调不是在同一个执行器上运行,因此它们将在实际的网络请求任务后面排队吗?恐怕只是一点猜测。这是什么?1万亿?@AlexeiKaigorodov——100万(1000万)的另一种说法——为什么不100万或1万?类似于“如何修复”的问题应该形成完整的可编译和可执行代码片段。否则,问题可能隐藏在代码的缺失部分,并且我们无法修复它。
    executorService = new ThreadPoolExecutor(poolSize, poolSize,
        0L, TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue<>(targetAmount),
        handler);
    service = MoreExecutors.listeningDecorator(executorService);
  private Boolean publish(String eventName, ProducerRecord rec, Producer producer) {
      AtomicBoolean failed = new AtomicBoolean(false);
      producer.send(rec, (metadata, exception) -> {
        if (exception != null) {
          failed.set(true);
        } else {
           System.out.println("The network request is successful");
        }
      });

      if (failed.get() == true) {
        return false;
      }

      return true;
  }