2016-01-18 124 views
0

我想确保主线程被阻塞,直到异步调用完成。 我正在创建一个新的线程来执行异步代码。 这里是我的代码:直到[R去世使异步代码阻塞

Thread r = new Thread() { 
    public void run() { 
    asyncCall(); 
    } 
}; 
r.run(); 
r.join(); 

r.join将阻止主线程。 是否足够? 当线程r实际上死亡?它是在异步调用完成后。

+0

然后创建一个线程有什么意义? “asyncCall”回调是否表示完成? – Fildor

+0

注意:'r.run()'是调用线程函数的错误方法。你需要使用'r.start()'。 – OldCurmudgeon

+0

'asyncCall'是一些第三方API的一部分吗? – Fildor

回答

2

首先,您需要拨打thread.start()而不是thread.run(),答案是肯定的,thread.join块,直到线程死亡。

它什么时候真的死了? Check this out

但是,建议直接使用executor而不是Threads。直到ř模具

Future<?> future = executor.submit(()->{}); 
future.get(); // blocks here 
+1

我感觉OP正在调用异步API。因此,所有包含在线程中并加入其中的方法在这种情况下都是无用的。 – Fildor

+0

@Fildor我完全同意 –

1

r.join将阻止主线程。

正确。

是否足够?

如果目标是阻止主线程继续执行,而r正在运行ayncCall那么是的。

线程r实际上死了吗?它是在异步调用完成后。

你可以说线程在asyncCall完成后完成执行。 “死亡”取决于你的定义。该线程可能在asyncCall完成后仍然存在,因为JVM决定将其重用作其他用途。它可能不会。

ps。您需要致电Thread.start(),而不是Thread.run()

+0

感谢您的明确答案。假定异步调用是对数据库的异步更新。我的一段代码是否确保在程序继续执行之前完成更新? – Soof

+1

是的,但是,如果'Thread.start()'和'Thread.join()之间没有任何关系,那么你可能不会首先创建一个线程,而只是将该函数作为main的一部分。 –