Android等待线程结束

Android等待线程结束,android,multithreading,Android,Multithreading,我的函数必须在线程结束后返回数据,我在start()我的线程之后使用wait()方法,但它不起作用: 私有类getDataThread扩展线程{ @凌驾 公开募捐{ super.run(); while(true){ 试一试{ // ... 睡眠(100); }捕捉(中断异常e){ // ... } } } } public void getSensorValues(Bundle){ // ... getDataThread gdt=新的getDataThread(); gdt.start();

我的函数必须在线程结束后返回数据,我在
start()
我的线程之后使用
wait()
方法,但它不起作用:

私有类getDataThread扩展线程{
@凌驾
公开募捐{
super.run();
while(true){
试一试{
// ...
睡眠(100);
}捕捉(中断异常e){
// ...
}
}
}
}
public void getSensorValues(Bundle){
// ...
getDataThread gdt=新的getDataThread();
gdt.start();
试一试{
gdt.wait();
}捕捉(中断异常e){
// ...
}
}
在LogCat中:

: An exception occurred during execution !
: Exception caught: java.lang.reflect.InvocationTargetException
: Exception cause: (SYSTEM) java.lang.IllegalMonitorStateException: object not locked by thread before wait() in getSensorValues
: status::FAILURE - output:: Possible errors: (SYSTEM) java.lang.IllegalMonitorStateException: object not locked by thread before wait() in getSensorValues.
我做错了什么?

wait()
不会等待线程完成。它等待另一个线程调用
notify()
notifyAll()

相反,您需要使用
join()
,以便其他线程将加入当前线程。当前线程将阻塞,直到另一个线程完成

也就是说,对于正在使用的对象,
wait()
notify()
都需要位于
synchronized
块中。例如:

synchronized (lock) {
    lock.wait();
}
wait()
不会等待线程完成。它等待另一个线程调用
notify()
notifyAll()

相反,您需要使用
join()
,以便其他线程将加入当前线程。当前线程将阻塞,直到另一个线程完成

也就是说,对于正在使用的对象,
wait()
notify()
都需要位于
synchronized
块中。例如:

synchronized (lock) {
    lock.wait();
}

您正在寻找的是
加入
,而不是
等待

public void getSensorValues(Bundle bundle) {
    // ...
    getDataThread gdt = new getDataThread();
    gdt.start();
    try {
        gdt.join();
    } catch (InterruptedException e) {
        // ...
    }
}
wait
有一个不同的用途,即向另一个线程发出事件已发生的信号。它需要一个匹配的调用
notify
。此外,您需要获取用于
等待/通知
的对象上的锁,这就是您获得该异常的原因


还有一件事:启动一个线程,然后立即加入它是多余的。您也可以在主线程上执行所有操作。

您正在寻找的是
加入
,而不是
等待

public void getSensorValues(Bundle bundle) {
    // ...
    getDataThread gdt = new getDataThread();
    gdt.start();
    try {
        gdt.join();
    } catch (InterruptedException e) {
        // ...
    }
}
wait
有一个不同的用途,即向另一个线程发出事件已发生的信号。它需要一个匹配的调用
notify
。此外,您需要获取用于
等待/通知
的对象上的锁,这就是您获得该异常的原因


还有一件事:启动一个线程,然后立即加入它是多余的。您也可以在主线程上执行所有操作。

在主线程上调用
thread.join()安全吗?我相信它会挡住主线@穆罕默德·巴巴尔:不在主线上,不。事实上,在调用
start
后立即调用
join
没有任何意义,因为没有并行执行。@Tudor那么,让
UI线程
等待直到
工作线程
完成运行的正确方法是什么呢。@Muhammad Babar:您不想让UI线程在任何情况下等待工作线程环境,因为这使得它对用户没有响应。理想情况下,工作线程将在后台执行其业务,然后使用UI框架允许的任何机制异步更新UI。调用主线程是否安全?我相信它会挡住主线@穆罕默德·巴巴尔:不在主线上,不。事实上,在调用
start
后立即调用
join
没有任何意义,因为没有并行执行。@Tudor那么,让
UI线程
等待直到
工作线程
完成运行的正确方法是什么呢。@Muhammad Babar:您不想让UI线程在任何情况下等待工作线程环境,因为这使得它对用户没有响应。理想情况下,工作线程将在后台执行其业务,然后使用UI框架允许的任何机制异步更新UI。