-1

我试图在调用函数时启动新线程,但它给了我

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中成功启动一个线程

4

2 回答 2

3

您似乎Object.wait()Thread.sleep(). sleep()习惯于无所事事一段时间,然后醒来。wait()用于等待某些条件发生,并被另一个线程调用notify()or唤醒notifyAll()。并且您必须持有您所在对象的监视器wait()

查看他们的 javadoc 以了解他们的工作以及如何使用它们。wait()无论如何,通常应该避免。您应该改用信号量等更高级别的抽象。

另外,请注意您的代码没有多大意义。您正在盯着一个线程,然后阻止当前线程等待启动的线程完成。你最好在当前线程中做所有事情。它会更简单、更清晰、更高效。

于 2013-03-15T08:40:14.500 回答
1

在使用 wait() 时使用以下

    synchronized (lock) {
        try {
        lock.wait();
            } catch (InterruptedException e) {
        return;
    }

在哪里

Object lock = new Object();

并在通知时使用相同的锁对象

    synchronized (lock) {
        lock.notify();                  
    }
于 2013-03-15T08:34:12.007 回答