多线程任务提交

时间:2015-12-02 12:12:12

标签: java multithreading threadpool

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

task1.get(8,TimeUnit.HOURS);

问题是上述语句后的代码将在8小时后执行。 我希望任务执行8小时,但之后的声明应立即打印。有人可以提出某些建议。

4 个答案:

答案 0 :(得分:2)

听起来你正在使用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) { 
     // ....

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我正在使用Java 6.所以我不能使用CompletableFuture

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

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