0

スレッドを使用したこの並行プログラミングを理解しようとしていますが、この wait() と notify() を取得していないようです

私のスレッドの 1 つが永遠に待機しており、通知が既に呼び出されていることに関係があると思われます。しかし、これを解決する方法がわかりません。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 のアドバイスは適切です。待機/通知を使用してマルチスレッドの学習を開始しないでください。より高度なシグナル伝達メカニズムから始める必要があります。たとえば、セマフォ、ラッチ、フューチャーなどです。

ただし、ブロックされているコードが in を認識しない理由wait()は、ARunnable.run待機と通知が異なるオブジェクトで実行されているためです。一方の「ランナブル」が他方にシグナルを送るようにするには、共有オブジェクトが必要であり、両方がそのオブジェクトを呼び出して呼び出す必要があります。notify()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();.

待機中のスレッドをウェイクアップして再度実行するには、同じモニター(つまり の同じインスタンス) を保持している他のスレッドがorARunnableを呼び出す必要があります。以下のようなものnotify()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 に答える