Java:执行器服务:newFixedThreadPool

Java : ExecutorService : newFixedThreadPool

这个问题可能有点老了。我对 Jboss 环境中的 ExecutorService 工作感到困惑。我使用了一些示例代码,我在其中使用 ExecutorService 提交任务,完成所有操作后我关闭了执行程序。

我面临的问题是在提交一个请求后,我在后续请求中遇到异常。 原因:java.util.concurrent.RejectedExecutionException:任务 java.util.concurrent.FutureTask@518ad6a2 被 java.util.concurrent.ThreadPoolExecutor@72114f80 拒绝[正在关闭,池大小 = 1,活动线程 = 1,排队任务 = 0,完成的任务 = 0]

ExecutorService executorService = Executors.newFixedThreadPool(3);

@POST
@Path("/request")
public Response checkAsync(final MultiMedia multiMedia) {
    final Random rand = new Random();
    final String random = String.valueOf(rand.nextInt(50) + 1);

    multiMediaJobs.put(random, multiMedia);

    final String jobId = "{ 'jobId' : " + random + "}";

    executorService.submit(new Runnable() {
            @Override
            public void run() {
                boolean result = veryExpensiveOperation(jobId);
                if (result) {
                    try {
                        MultiMedia multiMedia = (MultiMedia) multiMediaJobs.get(random);
                        multiMedia.getMediadata().getMetadata()
                                  .setAssetId(random);

                        final String uri = multiMedia.getCallback().getUri()+multiMedia.getCallback().getResource();

                        RestTemplate restTemplate = new RestTemplate();
                        String code = restTemplate.postForObject(uri,
                                multiMedia, String.class);

                        System.out.println(code);
                    } finally {
                        logger.debug("Map size: " + multiMediaJobs.size());
                        logger.debug("Time: "+System.currentTimeMillis());
                        multiMediaJobs.remove(random);
                    }
                }
            }

            private boolean veryExpensiveOperation(String jobId) {
                try {
                    Thread.sleep(7000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                logger.debug("Task is processed fully");

                return true;
            }
        });

    executorService.shutdown();
    try {
        executorService.awaitTermination(1, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return Response.status(Status.ACCEPTED)
                   .entity(commonHelper.toJSON(jobId)).build();
}

在JBOSS环境下真的需要调用shutdown吗?如果我删除它,它就是接受我的所有请求。我在这里看到的例子只是主要方法。我只是想知道它在实际应用中是如何工作的。

如果我误解了某些概念,请原谅我。

问题是您关闭了 ExecutorService。因此任何后续提交的任务都会立即被拒绝。

我想你对这里有些误解。

当您提交给执行者时,您通常会得到一个 Future<T> 对象。如果您需要此结果,您将调用 Future.get() 并且它将阻塞直到线程池执行您的作业。否则你可以让你的工作被执行。

你通常不会关闭执行器,除非你真的想关闭它,不接受任何作业,让那些排队的执行。