我想确保主线程被阻塞,直到异步调用完成。 我正在创建一个新的线程来执行异步代码。 这里是我的代码:直到[R去世使异步代码阻塞
Thread r = new Thread() {
public void run() {
asyncCall();
}
};
r.run();
r.join();
r.join
将阻止主线程。 是否足够? 当线程r实际上死亡?它是在异步调用完成后。
我想确保主线程被阻塞,直到异步调用完成。 我正在创建一个新的线程来执行异步代码。 这里是我的代码:直到[R去世使异步代码阻塞
Thread r = new Thread() {
public void run() {
asyncCall();
}
};
r.run();
r.join();
r.join
将阻止主线程。 是否足够? 当线程r实际上死亡?它是在异步调用完成后。
首先,您需要拨打thread.start()
而不是thread.run()
,答案是肯定的,thread.join
块,直到线程死亡。
它什么时候真的死了? Check this out
但是,建议直接使用executor
而不是Threads
。直到ř模具
Future<?> future = executor.submit(()->{});
future.get(); // blocks here
我感觉OP正在调用异步API。因此,所有包含在线程中并加入其中的方法在这种情况下都是无用的。 – Fildor
@Fildor我完全同意 –
r.join将阻止主线程。
正确。
是否足够?
如果目标是阻止主线程继续执行,而r
正在运行ayncCall
那么是的。
线程r实际上死了吗?它是在异步调用完成后。
你可以说线程在asyncCall
完成后完成执行。 “死亡”取决于你的定义。该线程可能在asyncCall
完成后仍然存在,因为JVM决定将其重用作其他用途。它可能不会。
ps。您需要致电Thread.start()
,而不是Thread.run()
。
感谢您的明确答案。假定异步调用是对数据库的异步更新。我的一段代码是否确保在程序继续执行之前完成更新? – Soof
是的,但是,如果'Thread.start()'和'Thread.join()之间没有任何关系,那么你可能不会首先创建一个线程,而只是将该函数作为main的一部分。 –
然后创建一个线程有什么意义? “asyncCall”回调是否表示完成? – Fildor
注意:'r.run()'是调用线程函数的错误方法。你需要使用'r.start()'。 – OldCurmudgeon
'asyncCall'是一些第三方API的一部分吗? – Fildor