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

Executor服务isDone()行为

罗茂实
2023-03-14

我刚开始学习Java多线程。我从这个简单的代码开始,但是submitresults.isdone()似乎从未实现。

我希望“任务执行”结果应该被打印出来,但我得到了一个空控制台。

下面是我的简单类:

public class FuturesExample {

    public static void main(String[] args) {

        FuturesExample.executeThreadScheduler();
    }

    static void executeThreadScheduler()
    {
        ExecutorService service = Executors.newFixedThreadPool(10);
        Callable<String> callableTask = ()->{
            TimeUnit.MILLISECONDS.sleep(300);
            return "Task Executed" ;
        };

        Future<String> submitResults = service.submit(callableTask);

            try {
                if(submitResults.isDone())

                {
                    System.out.println(submitResults.get());
                }
                service.shutdown();
                if(!service.awaitTermination(800,TimeUnit.MILLISECONDS))
                {
                    service.shutdownNow();
                }
            } catch (InterruptedException e) {
                service.shutdownNow();
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }


    }

共有1个答案

马祺
2023-03-14

您不需要等待任务完成,因此submitresults.isdone()返回false并终止代码。在if条件之前调用submitresults.get(),它将阻止代码的执行,直到可调用对象完成其执行,您将看到“任务执行”将被打印出来。更多信息可以在这里和这里找到

 类似资料:
  • 我正在开发一个应用程序,不断地从Kafka主题中读取数据。这些数据是字符串格式的,然后我将其写入xml文件 要编写这些文件,我使用执行服务。 我想知道什么时候应该关闭我的执行服务。如果我的应用程序是有时间限制的,我会在executor实例上使用它,但我的应用程序应该持续运行。 如果发生任何异常,我的整个应用程序被杀死,它会自动关闭我的执行者吗?或者我应该捕获一个未检查的异常并关闭我的执行器,就像我

  • 我在玩java多线程代码。我创建了一个具有固定线程池的executor服务。我正在提交两个任务顺序。我试图用线程使第一个任务变得很长。我在想这两个任务将并行运行。然而,当我运行程序时,程序会等待一段时间,然后输出一个B,这意味着编译器首先完成了第一个任务,然后才执行第二个任务。事实上,我在期待,因为第二个任务是一个短任务,它会在第一个任务之前完成。有什么解释吗?

  • 我想做的是,创建一个executor服务(具有固定数量的线程)-->,然后将新线程的创建/新线程的任务执行移交给该executor。 由于我对Executor非常陌生,所以我想知道的是,我如何更改上面的代码,以便不是形成一个新的单独的线程,而是在线程池中创建一个新线程。我看不到任何创建线程的命令(在线程池中)-->将上面的任务移交给那个线程(而不是像上面那样移交给一个独立的线程)。 请告诉我如何解

  • java.util.concurrent.Executor接口是一个支持启动新任务的简单接口。 ExecutorService方法 Sr.No. 方法和描述 1 void execute(Runnable command) 在将来的某个时间执行给定的命令。 例子 (Example) 以下TestThread程序显示了基于线程的环境中Executor接口的使用。 import java.util.c

  • 我有n个从驱动流中检索记录的工作线程(这对这个问题并不重要),然后将它们推送到执行器服务,在那里处理记录并将其持久化到后端数据库。这个相同的执行器服务实例用于所有工作线程。 现在有一个场景,任何给定的worker循环都会停止处理记录和块,直到它提交的所有记录都得到完全处理。这本质上意味着,对于来自特定工作线程的记录,执行器服务中不应该有挂起/正在运行的线程。 实现的一个非常简单的示例如下: > 工

  • 我通过使用Executor服务创建3个线程(extends Runnable)并提交它们来执行主类中的三个任务。如下所示: 当线程中出现异常时,我捕获它并执行System.exit(-1)。但是,如果发生任何异常,我需要返回到主类,并在那里执行一些语句。这怎么做?我们能在没有FutureTask的情况下从这些线程中返回一些东西吗?