Java 多线程任务提交

Java 多线程任务提交,java,multithreading,threadpool,Java,Multithreading,Threadpool,我想运行一个任务8小时。 我正在使用ExecutorService executor=Executors.newFixedThreadPool30。 提交任务后,我等待了8个小时。 这是我使用的代码 task1.get(8,TimeUnit.HOURS); 问题是上述语句后的代码将在8小时后执行。 我希望任务执行8小时,但之后的语句应该立即打印出来。有人能提出一些建议吗。你可以使用CompletableFuture,然后使用Apply。那么代码就不会在get上等待,因为get是阻塞方法,在您的

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

task1.get(8,TimeUnit.HOURS);
问题是上述语句后的代码将在8小时后执行。
我希望任务执行8小时,但之后的语句应该立即打印出来。有人能提出一些建议吗。

你可以使用CompletableFuture,然后使用Apply。那么代码就不会在get上等待,因为get是阻塞方法,在您的情况下,该方法最多等待8个小时

听起来好像您使用的是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) { 
     // ....
我认为这项关于完成任务的工作可能会对你有所帮助


我同意@k0ner,可以在Java8上使用。这里有一个关于使用CompletableFuture的例子。getlong timeout,TimeUnit方法具有阻塞行为,这不是您想要的

我正在使用Java 6。所以我不能用完全的未来

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


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

然后切换2个语句,但get会阻止调用,问题是如何避免调用。这不是我从问题中理解的,但也许你是对的@拉什米-你能澄清一下吗?所以不要在你的主线程中调用get。您可以在等待完成的不同线程中执行此操作。或者您甚至可以在task1中打印结果。这完全取决于你是否需要将结果传递到其他地方。