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我完全同意