我想要运行一个任务8个小时。
我正在使用ExecutorService executor = Executors.newFixedThreadPool(30).
提交任务后,我等了8个小时。
这是我用过的代码。
task1.get(8,TimeUnit.HOURS);
问题是上述语句后的代码将在8小时后执行。 我希望任务执行8小时,但之后的声明应立即打印。有人可以提出某些建议。
答案 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分钟)。任务存储在数据结构中。
时间结束后,我正在检索任务并取消它。