0

我的函数必须在我的线程结束后返回数据,我在我的线程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.

我做错了什么?

4

2 回答 2

4

您正在寻找join,而不是wait

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

wait有不同的目的,即向另一个线程发出事件已发生的信号。它需要对notify. 此外,您需要获取正在使用的对象上的锁wait/notify,这就是您遇到该异常的原因。

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

于 2012-07-13T10:26:41.907 回答
1

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

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

也就是说,两者wait()和都notify()需要在synchronized正在使用的对象的块内。例子:

synchronized (lock) {
    lock.wait();
}
于 2012-07-13T10:16:58.363 回答