java.util.concurrent.Future.get()未返回
我有以下Java代码:java.util.concurrent.Future.get()未返回,java,concurrency,multithreading,future,executorservice,Java,Concurrency,Multithreading,Future,Executorservice,我有以下Java代码: final Future future = exeService.submit( new Runnable() { public void run() { myObject.doSomething(); } } ); future.get(); 其中,exeService是 java.util.concurrent.ExecutorService 问题是,myObject.doSomething
final Future future = exeService.submit(
new Runnable() {
public void run() {
myObject.doSomething();
}
}
);
future.get();
其中,exeService
是
java.util.concurrent.ExecutorService
问题是,myObject.doSomething()
永远不会返回,因此,future.get()
永远不会返回
但是,如果我将对submit
的调用替换为对execute
的调用,如下所示:
exeService.execute(
new Runnable() {
public void run() {
myObject.doSomething();
}
}
);
调用myObject.doSomething()
会返回。我不知道这是否重要,但是doSomething()
是一种void
方法
为什么使用execute
时doSomething()
正在完成,而使用submit
时却没有完成
另外,我不需要使用Future.get()
;这似乎是最自然的方式。(我在CountdownLatch
中也遇到了同样的问题)关键是我需要等待doSomething()
完成,然后才能继续,而且,由于复杂的原因,我不在这里讨论,我需要在单独的线程上启动它。如果有其他可行的方法,那就好了。如:
在某个时间执行给定的命令
未来的时间。命令可以
在池中的新线程中执行
线程,或在调用线程中
遗嘱执行人的自由裁量权
实施
因此,方法execute()
立即返回,使您无法查询已提交任务的状态
另一方面:
提交可运行任务以执行
并返回一个表示
任务未来的get方法将
成功返回null
完成
只有在成功的比赛后,你才能回来,所以在你的情况下永远不会回来
这一点在以下文件中得到进一步说明:
如有必要,等待计算
完成,然后检索其
结果
我创建了一个:
package com.stackoverflow.q2585971;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.Future;
公开课考试{
公共静态void main(字符串args[])引发异常{
ExecutorService executor=Executors.newCachedThreadPool();
Future=executor.submit(
新的Runnable(){
公开募捐{
试一试{
睡眠(1000);
}捕捉(中断异常e){
System.out.println(“Epic fail”);
}
}
}
);
System.out.println(“等待任务完成…”);
future.get();
System.out.println(“任务完成!”);
executor.shutdown();
}
}
它工作得非常好。它首先打印
Waiting for task to finish..
正在等待任务完成。。
然后过了一秒钟你就明白了
Task finished!
任务完成了!
所以,你的问题在别的地方。我将在这里重复我对你的问题的评论:
你的问题很令人困惑。第一个构造应该可以正常工作。困惑在于“回归”。你是说“完成”还是“执行”?您的困惑似乎是基于这样一个事实,即
future.get()
实际上等待runnable完成,因此将阻塞线程并阻止它在future.get()
行之后执行剩余的代码
检查doSomething
中是否存在死锁
我会先搜索电话
如果您等待某个对象,则需要通过调用或从另一个线程向您正在等待的对象发送信号。Java期货正在阻塞<代码>获取()。此方法将阻止当前线程,直到将来的实例完成其工作,因此需要使用一个线程,而不是仅为了管理完成时发生的事情而必须执行的工作您询问的是
doSomething
的行为,但请不要告诉我们。我们帮不了你…你的问题很让人困惑。第一个构造应该可以正常工作。困惑在于“回归”。你是说“完成”还是“执行”?您的困惑似乎是基于这样一个事实,即future.get()
实际上等待runnable完成,因此会阻塞线程并阻止它在future.get()之后执行剩余的代码。您是如何创建“exeService”的?是ThreadPoolExecutor还是其他什么?从来没有?所以你暗示myObject.doSomething()代码>类似于无限循环吗?那么,为什么另一种构造会起作用呢?请记住,void
是一个完全有效的返回值。作者说“问题是myObject.doSomething()永远不会返回”,所以我假设这个函数类似于无限循环(如服务器线程或其他)。是的。。那么,您如何解释它在使用execute()
而不是submit()
时“确实返回”?它在使用“execute”时“返回”,因为它在某个地方刚刚启动,他从不等待它完成。当使用submit()时,他会等待它完成,但它永远不会完成。如果使用treadpoolExecutor,可能有两个原因:1。遗嘱执行人正忙于执行其他事情。2.doSomething()永远不会返回。e、 g.这是一个无限循环。+1用于阅读问题并突破OP的困惑
Task finished!