java.util.concurrent.Future.get()未返回

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

我有以下Java代码:

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!