【问题标题】:Mutithreading task submission多线程任务提交
【发布时间】:2015-12-02 12:12:11
【问题描述】:

我想运行一个任务 8 小时。 我正在使用ExecutorService executor = Executors.newFixedThreadPool(30). 提交任务后,我等待了 8 个小时。 这是我使用的代码。

task1.get(8,TimeUnit.HOURS);

问题是上述语句后的代码将在 8 小时后执行。 我希望任务执行 8 小时,但之后的语句应立即打印。有人可以建议一些方法吗?

【问题讨论】:

  • 然后切换2条语句

标签: java multithreading threadpool


【解决方案1】:

听起来您使用 ExecutorService 和 Future 有点不正确。

当您提交任务时,它可能(取决于您的线程池)开始执行。如果您想在启动后打印某些内容,那么您应该这样做。

Future.get 用于等待检索结果(在您的情况下最多 8 小时),因此将阻塞直到完成。

类似的东西(未测试):

Callable task = new Callable<String>() {
    // 8 hour task
}

Future<String> future
       = executor.submit(task); // Task may begin here
System.out.println("Task has been submitted, let's wait");
String result;
try {
     result = future.get(8,TimeUnit.HOURS); //
} catch (ExecutionException ex) { 
     // ....

【讨论】:

  • get 正在阻止调用,问题是如何避免这种情况
  • 这不是我从问题中理解的,但也许你是对的。 @Rashmi - 你能澄清一下吗?
【解决方案2】:

您可以使用CompletableFuture 并在其上使用thenApply。然后代码不会等待get,因为get 是阻塞方法(在您的情况下)最多等待8 小时

【讨论】:

    【解决方案3】:

    我认为这个关于任务完成的thread 可能会对你有所帮助。

    我同意@k0ner,使用Java8 上可用的CompletableFuture。这个answer 有一个关于使用CompletableFuture 的示例。 get(long timeout, TimeUnit unit) 方法有一个阻塞 行为,这不是你想要的。

    【讨论】:

      【解决方案4】:

      我使用的是 Java 6。所以我不能使用 CompletableFuture

      我正在用这个逻辑解决问题。我已经删除了获取功能。 在run() 方法中,我得到了使用Date 实用程序启动的线程的startTime。然后我正在检查 8 小时是否结束(现在我已经测试了 1 分钟)。任务存储在数据结构中。

      时间结束后,我正在检索任务并取消它。

      【讨论】:

      • 所以请避免在主线程中调用get。您可以在等待完成的不同线程中执行此操作。或者您甚至可以在task1 中打印结果。这完全取决于您是否需要(或不需要)将结果传递到其他地方。
      猜你喜欢
      • 2016-03-15
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多