0

我试图用线程理解这种并发编程,但我似乎没有得到这个 wait() 和 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();}
}
}
4

2 回答 2

2

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

但是,您的代码被阻止的原因是没有看到wait()in是等待和通知是在不同的对象上执行的。如果您希望一个“可运行”向另一个发出信号,则它们需要一个共享对象,并且它们都需要在该对象上并调用它。ARunnable.runnotify()BRunnable.runsynchronizewait()notify

于 2013-05-08T12:14:42.087 回答
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)的其他一些线程应该调用notify()or notifyAll();。像下面的东西

class ARunnable implements Runnable{
    boolean ready = false;
    //setter for ready..
    @Override
    public void run(){
        Log.d("Runnable", "A Inside Run - WAIT");
        try{
            synchronized(this){
                if(!ready) {
                      wait();
                }
                else {
                     notifyAll(); // Now the thread which was waiting earlier, will wake-up and start resuming the execution.
                }
            }
        } catch (InterruptedException e) {}
        //Log.d("Runnable", "A Inside Run - CONTINUE");
    }
    }
于 2013-05-08T12:13:49.477 回答