2013-03-15 3 views
-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() { 
    } 

как я могу запустить поток в андроид успешно

+0

прочитайте документ для метода ожидания. (что вы, вероятно, сделали, не так ли, но все же, прочитайте его снова. все это есть.) – njzk2

ответ

1

при использовании ожидания() используйте следующие

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

где

Object lock = new Object();

и в то время как уведомив использовать один и тот же объект стопорное

synchronized (lock) { 
     lock.notify();     
    } 
+0

как вам приятно упростить и перефразировать такой документ. (нет, на самом деле, никаких сарказмов. Я просто не понимаю, в чем смысл) – njzk2

+0

извините, если я сделал что-то не так. но многие проблемы можно решить, просто указав на doc/links. Разве мы не должны точно ответить на этот вопрос? Я более активен в том, чтобы отвечать только с прошлой недели, несмотря на то, что у меня есть старая учетная запись, так что, возможно, я что-то не понял. – stinepike

+0

проблема заключается в том, что вопрос Анвара Мохамеда ясно показывает, что он не читал документацию для метода, который он использует. Он не сталкивается с какой-либо проблемой, кроме этого. Предоставление ему кода, который специально решает исключение, ему не поможет, так как (как объяснил JB Nizet), он явно злоупотребляет методом ожидания. Кроме того, когда вопрос является таким основным, на него может ответить A/poiting на документ или B/poiting на существующий вопрос, пожалуйста, сделайте это. – njzk2

3

Это кажется, что вы путаете Object.wait() с Thread.sleep(). sleep() используется, чтобы ничего не делать в течение некоторого времени, а затем проснуться. wait() используется для ожидания какого-либо состояния и пробуждается другим потоком, вызывающим notify() или notifyAll(). И вы должны держать монитор объекта, на котором вы находитесь wait().

Посмотрите их javadoc, чтобы понять, что они делают и как их использовать. wait() вообще следует избегать. Вместо этого вы должны использовать абстракции более высокого уровня, такие как Семафоры.

Также обратите внимание, что ваш код не имеет большого смысла. Вы смотрите на поток, а затем блокируете текущий, ожидающий завершения начатого потока. Вам лучше сделать все в текущей теме. Это было бы проще, яснее и эффективнее.

Смежные вопросы