我正在尝试在调用函数时启动新线程,但它给了我
Android: java.lang.IllegalMonitorStateException: object not locked by thread before wait()
这是我的代码
public class webcam_audio_record_V1_4 extends webcam_audio_record implements Command {
private static final int TLV_EXTENSIONS = 20000;
private static final int TLV_TYPE_AUDIO_DURATION = TLVPacket.TLV_META_TYPE_UINT | (TLV_EXTENSIONS + 1);
private static final int TLV_TYPE_AUDIO_DATA = TLVPacket.TLV_META_TYPE_RAW | (TLV_EXTENSIONS + 2);
public int execute(Meterpreter meterpreter, TLVPacket request, TLVPacket response) throws Exception {
int duration = request.getIntValue(TLV_TYPE_AUDIO_DURATION);
Thread thread = new Thread(new Runnable() { public void run() { record(); } });
thread.start();
try { wait(duration * 1000); } catch (InterruptedException e) {}
try { thread.join(); } catch (InterruptedException e) {}
play();
return ERROR_SUCCESS;
}
public void record() {
}
public void play() {
}
如何在android中成功启动线程
答案 0 :(得分:3)
您似乎对Object.wait()
Thread.sleep()
感到困惑。 sleep()
用于在一段时间内不执行任何操作,然后唤醒。 wait()
用于等待某些条件发生,并被另一个调用notify()
或notifyAll()
的线程唤醒。并且您必须握住wait()
上的对象的监视器。
查找他们的javadoc,了解他们的工作以及如何使用它们。无论如何,通常应该避免使用wait()
。您应该使用更高级别的信息,例如信号量。
另外,请注意您的代码没有多大意义。你正在盯着一个线程,然后阻止当前的线程等待启动的线程完成。你最好在当前线程中做所有事情。它会更简单,更清晰,更有效。
答案 1 :(得分:1)
使用wait()时使用以下
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
return;
}
其中
Object lock = new Object();
并且在通知时使用相同的锁定对象
synchronized (lock) {
lock.notify();
}