-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 に答える