当前位置: 首页 > 知识库问答 >
问题:

Java中Do While循环的ExecutorService

屈升
2023-03-14

我是并发新手,我试图为do-time循环实现执行器服务并发。但是我总是遇到Reject tedExecutionException

以下是我的示例代码:

do {    
    Future<Void> future = executor.submit(new Callable<Void>() {
    @Override        
    public Void call() throws Exception {

        // action
        return null;
    }
    });

    futures.add(future);
    executor.shutdown();

    for (Future<Void> future : futures) {
        try {
            future.get();
        }
        catch (InterruptedException e) {
            throw new IOException(e)
        }          
    } 
}
while (true);

但这似乎是不正确的。我想我在错误的地方调用了关闭。有人能帮我在do-time循环中正确实现执行器服务吗?谢谢。


共有3个答案

何楷
2023-03-14
匿名用户

来自ThreadPoolExecutor文档:

被拒绝的任务

在方法execute(Runnable)中提交的新任务将在执行器关闭时被拒绝,并且当执行器对最大线程和工作队列容量使用有限边界,并且处于饱和状态时也将被拒绝。

在任何一种情况下,执行方法都会调用其Reject tedExecutionHandler的Reject tedExecutionHandler.rejectedExecution(Runnable, ThreadPoolExecitor)方法

从您的代码中可以清楚地看出,您首先调用Shutdown(),然后再提交任务。

另一方面,请参阅此相关SE问题以获取关闭ExecutorService的正确方法:

ExecutorService的关闭()不会等到所有线程都完成

柯升
2023-03-14

没错,没有在正确的时间调用shutdown方法。调用关闭后,ExecutorService将不接受任务(除非您实现自己的版本)。

您应该在将所有任务提交给执行程序后调用关闭,因此在这种情况下,在do-time循环之后的某个地方。

莘光华
2023-03-14

ExecutorService.shutdown()停止ExecutorService接受任何作业。当您完成提交作业时,应该调用它。

也是未来。get()是一个阻塞方法,这意味着它将阻塞当前线程的执行,除非这个未来(调用get)返回,否则循环的下一次迭代将不会继续。这将在每次迭代中发生,这使得代码非并行。

您可以使用倒计时闩锁等待所有作业返回。

以下是正确的代码。

final List<Object> results = Collections.synchronizedList(new ArrayList<Object>());
final CountDownLatch latch = new CountDownLatch(10);//suppose you'll have 10 futures

do {
    Future<Void> future = executor.submit(new Callable<Void>() {
        @Override
        public Void call() throws Exception {
            // action
            latch.countDown();//decrease the latch count
            results.add(result); // some result
            return null;
        }
    });

    futures.add(future);
} while (true);

executor.shutdown();

latch.await(); //This will block till latch.countDown() has been called 10 times.

//Now results has all the outputs, do what you want with them.

此外,如果您使用的是Java 8,那么您可以看看这个答案https://stackoverflow.com/a/36261808/5343269

 类似资料:
  • 问题内容: 我正在读一本书,重新整理了我的数据结构,它提出的一个问题是不使用“第一个”和“最后一个”指针来构建一个循环的单链表,而是通过使用一个引用来访问它。当前”。我不确定我是否理解这个问题,我一直以为我至少需要第一个或最后一个。这是我的实现,但是它具有“ first”,不确定如何解决。您能否评论一下如何调整代码以消除对第一代码的依赖? 然后是列表本身: 问题答案: 如果您有一个循环链表,则每个

  • 我需要对while或do循环进行编码,以确定用户输入的数字是否在特定范围内(30

  • 问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循

  • 问题内容: 给定一个以复杂的,循环的方式相互引用的类实例的集合:垃圾收集器是否可能无法释放这些对象? 我隐约记得过去这是JVM中的问题,但我 认为 这在几年前已解决。但是,在jhat中进行的一些调查显示,循环引用是我现在面临的内存泄漏的原因。 注意:我一直给人以JVM能够解析循环引用并从内存中释放这种“垃圾岛”的印象。 但是,我提出这个问题只是为了看看是否有人发现了任何异常。 问题答案: 循环引用

  • 问题内容: 美好的一天! 我正在做一个游戏,但我希望它有背景声音。我为此创建了一个类,并在主类上调用它。我的代码如下: 这是我上课的主要地点。 我的问题是音乐无法播放。这是什么意思?我的文件类型为Microsoft Wave声音格式,大小为796kb。我可以知道我做错了吗?您的建议将不胜感激。先感谢您。 问题答案: 我的猜测是文件已以类无法理解的格式进行编码。我找不到该类的文档(??),但是我会尝

  • 我已经有一段时间没有编程了,我正在努力回到事情的转折点,这就是我已经走了多远。我的问题是,我如何循环第二个问题,这样,如果回答不是肯定的,它会再次问这个问题。我曾尝试在if语句周围放置一个循环,但每当我尝试从用户那里获得另一个响应时,它告诉我无法使用变量response来执行此操作。我觉得这是一个简单的修复,因为我理解循环,但我有一个困难的时候围绕着这个具体的问题我的头,提前谢谢你。