Java 进行异步代码阻塞
我想确保在异步调用完成之前阻塞主线程。 我正在创建一个新线程来执行异步代码。 这是我的密码:Java 进行异步代码阻塞,java,asynchronous,blocking,Java,Asynchronous,Blocking,我想确保在异步调用完成之前阻塞主线程。 我正在创建一个新线程来执行异步代码。 这是我的密码: Thread r = new Thread() { public void run() { asyncCall(); } }; r.run(); r.join(); r.join将阻止主线程,直到r死亡。 这是否足够? 当线程r实际死亡时?是在异步调用完成之后 首先,您需要调用thread.start()而不是thread.run(),答案是肯定的,thread.join阻塞直
Thread r = new Thread() {
public void run() {
asyncCall();
}
};
r.run();
r.join();
r.join
将阻止主线程,直到r死亡。
这是否足够?
当线程r实际死亡时?是在异步调用完成之后 首先,您需要调用
thread.start()
而不是thread.run()
,答案是肯定的,thread.join
阻塞直到线程死亡
它什么时候真的死了
但是,建议使用执行器
,而不要直接使用线程
Future<?> future = executor.submit(()->{});
future.get(); // blocks here
Future-Future=executor.submit(()->{});
future.get();//在这里街区
首先,您需要调用thread.start()
而不是thread.run()
,答案是肯定的,thread.join
阻塞直到线程死亡
它什么时候真的死了
但是,建议使用执行器
,而不要直接使用线程
Future<?> future = executor.submit(()->{});
future.get(); // blocks here
Future-Future=executor.submit(()->{});
future.get();//在这里街区
r、 join将阻塞主螺纹,直到r消失
对
这是否足够
如果目标是防止主线程在运行r
时继续执行ayncCall
,则选择是
当线程r实际死亡时?是在异步调用完成之后
您可以说线程在asyncCall
完成后完成执行。“死亡”取决于你的定义。在asyncCall
完成后,线程可能处于活动状态,因为JVM决定将其重新用于其他目的。可能不会
另外,您需要调用Thread.start()
,而不是Thread.run()
r、 join将阻塞主螺纹,直到r消失
对
这是否足够
如果目标是防止主线程在运行r
时继续执行ayncCall
,则选择是
当线程r实际死亡时?是在异步调用完成之后
您可以说线程在asyncCall
完成后完成执行。“死亡”取决于你的定义。在asyncCall
完成后,线程可能处于活动状态,因为JVM决定将其重新用于其他目的。可能不会
另外,您需要调用
Thread.start()
,而不是Thread.run()
谢谢您的明确回答。假设异步调用是对数据库的异步更新。我的一段代码是否确保在程序继续执行之前完成更新?是的,但是,如果Thread.start()
和Thread.join()
之间没有任何差异,那么您最好不要首先创建线程,而只是将函数作为main的一部分。谢谢您的明确回答。假设异步调用是对数据库的异步更新。我的一段代码是否确保在程序继续执行之前完成更新?是的,但是,如果Thread.start()
和Thread.join()?“asyncCall”回调是否表示完成?注意:r.run()
是调用线程函数的错误方法。你需要使用r.start()
。asyncCall
是第三方API的一部分吗?你能告诉我们它是什么框架吗?我想你得听听电话。但是如果我们不知道API,我们就不知道了。如果库启动另一个线程以执行任务,包装启动调用将没有帮助。您将最终等待Enquence完成,而不是整个事务。那么创建线程有什么意义呢?“asyncCall”回调是否表示完成?注意:r.run()
是调用线程函数的错误方法。你需要使用r.start()
。asyncCall
是第三方API的一部分吗?你能告诉我们它是什么框架吗?我想你得听听电话。但是如果我们不知道API,我们就不知道了。如果库启动另一个线程以执行任务,包装启动调用将没有帮助。您最终将等待Enquence完成,而不是整个事务。我感觉OP正在调用一个异步API。所以,在这种情况下,所有的线程包装和连接都是无用的。@Fildor我完全同意,我感觉OP在调用异步API。所以,在这种情况下,所有用线包裹和连接的东西都是无用的。@Fildor我完全同意