我正在尝试用线程理解这个并发编程,我似乎没有得到这个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();}
}
}
答案 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();