Android等待Thread结束

时间:2012-07-13 10:13:27

标签: android multithreading

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

private class getDataThread extends Thread {
    @Override
    public void run() {
        super.run();
        while (true) {
            try {
                // ...
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // ...
            }
        }
    }
}

public void getSensorValues(Bundle bundle) {
    // ...
    getDataThread gdt = new getDataThread();
    gdt.start();
    try {
        gdt.wait();
    } catch (InterruptedException 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.

我做错了什么?

2 个答案:

答案 0 :(得分:4)

您正在寻找join,而不是wait

public void getSensorValues(Bundle bundle) {
    // ...
    getDataThread gdt = new getDataThread();
    gdt.start();
    try {
        gdt.join();
    } catch (InterruptedException e) {
        // ...
    }
}

wait有不同的目的,即向另一个线程发出事件已发生的信号。它需要匹配notify的匹配。此外,您需要获取用于wait/notify的对象的锁定,这就是您获得该异常的原因。

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

答案 1 :(得分:1)

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

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

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

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