Android Java Notify不会触发等待

时间:2013-05-08 12:01:11

标签: java android

我正在尝试用线程理解这个并发编程,我似乎没有得到这个wait()和notify()

我怀疑它与我的一个线程永远等待并且已经调用了notify有关。但我不知道如何解决这个问题。我通过stackoverflow上的其他帖子阅读,但无法理解。

这是我的代码,如果有人能指出我正确的方向,将会很有帮助。

package com.example.thread_android;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d("Stage", "onCreate");

    Runnable AthreadJob = new ARunnable();
    Runnable BthreadJob = new BRunnable();
    Thread myThreadOne = new Thread(AthreadJob);
    Thread myThreadTwo = new Thread(BthreadJob);
    myThreadOne.start();
    myThreadTwo.start();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
}

class ARunnable implements Runnable{
@Override
public void run(){
    Log.d("Runnable", "A Inside Run - WAIT");
    try{
        synchronized(this){wait();}
    } catch (InterruptedException e) {}
    //Log.d("Runnable", "A Inside Run - CONTINUE");
}
}

class BRunnable implements Runnable{
@Override
public void run(){
    Log.d("Runnable", "B Inside Run");
    synchronized (this) {notify();}
}
}

2 个答案:

答案 0 :(得分:2)

JB Nizet的建议是合理的。不要使用wait / notify开始学习多线程。你应该从更高的信号机制开始;例如信号量,锁存器,期货等。

但是,wait()ARunnable.run中阻止的代码未在notify()中看到BRunnable.run的原因是等待和通知正在执行对象。如果您希望一个“runnable”向另一个发出信号,他们需要一个共享对象,他们都需要synchronize对该对象并在其上调用wait()notify

答案 1 :(得分:1)

在代码中

class ARunnable implements Runnable{
@Override
public void run(){
    Log.d("Runnable", "A Inside Run - WAIT");
    try{
        synchronized(this){wait();}
    } catch (InterruptedException e) {}
    //Log.d("Runnable", "A Inside Run - CONTINUE");
}
}

this表示ARunnable的正在运行的实例。此实例实际上是线程监视器对象线程锁定/解锁以执行同步块),并且您已将当前线程询问为wait();

要使等待的线程唤醒并再次运行,其他一些线程,持有相同的监视器(即,ARunnable的相同实例)应该调用{{1} }或notify()。像下面的东西

notifyAll();