我的函数必须在我的线程结束后返回数据,我在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.
我做错了什么?
答案 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();
}