在android中启动新线程时出错

时间:2013-03-15 08:31:12

标签: java android

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

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

2 个答案:

答案 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();                  
    }