2

リスト内のデータを処理するために 2 つのスレッドを同期するにはどうすればよいですか?

  • スレッド Aはリスト内の項目を追加/変更しています (リストへの書き込み)
  • スレッドBはアイテムを表示しています(リストの読み取りのみ)

リストを表示できるようになったら、スレッド Bに「通知」したいと思います。リストを読み取るときに、スレッド Aによって変更されてはなりません。スレッド Bが読み取りを完了すると、スレッドAは再びリストの変更を開始できます。

私の推測では

  • synchronized(obj)
  • list.wait()+list.notify()

スレッドは互いに呼び出していません。それらは常に同時に実行されます。

4

4 に答える 4

0

一般的な概念(あなたの場合に見られるように)は次のとおりです。

List1)使用する予定の のインスタンスを作成します。

2)thread Aおよびthread Bに対応する 2 つのクラスを作成し、それらの両方を実装し、コンストラクターのパラメーターとしてRunnable受け取ります。List

3) リスト インスタンスでこれら 2 つのクラスを同期します。

// method in class that adds
public void add() {
  synchronized(list) {
    // perform addition ...
    list.notify();
  }
}

// method in class that reads
public void read() throws InterruptedException {
  synchronized(list) {
    while (list.isEmpty())
      list.wait();
    // process data ...
  }
}

4) これら 2 つのクラスのインスタンスに対応する引数を持つ 2 つのスレッドを作成し、それらを開始します。

于 2013-04-30T09:19:57.193 に答える
0

ここまたはここで提案されている同時実行パッケージを試してみましたが、うまく機能します。スレッドは互いにロックアウトします。

final Lock lock = new ReentrantLock(true);

// thread A
lock.lock();
// write to list
lock.unlock();

// thread B
lock.lock();
// read from list
lock.unlock();

それらが次々と正確に実行できるかどうかわからず、通知機能を取得できませんでした。しかし、それは私のアプリケーションを傷つけません。

于 2013-04-30T10:08:29.393 に答える