0

私は、wait()、notify()、notifyAll()、Thread.run()、synhronized などのプリミティブな Java 同時実行構造を使用するプロジェクトに取り組んでいます。私のプロジェクトには、複数のスレッド (Thread クラスの拡張) があります。 ) 定期的にキューからオブジェクトを取得します。したがって、内部 TimerTask クラスを持つ Timer クラスを使用します。

私の問題は、他のスレッドを定期的に起動する方法を取得できなかったことです。私のメイン クラスは、これらのスレッドやタイマー クラスではありません。したがって、別のクラスから実行を呼び出します。これらのスレッドを待機させ、100 ミリ秒ごとに 1 回通知する方法がわかりませんでした。私のタイマークラスは次のとおりです。

public class Controller extends Timer{

    int counter;
    TimerTask task;
    final Controller c = this;

    public class PeriodicTime extends TimerTask {

        @Override
        public void run() {

            if(counter > 0) {
                //do some stuff to wake up threads

            }
            counter++;
        }
    }

    Controller () {
        super ();
        this.task = new PeriodicTime();
        counter = 0;
        this.schedule(task, 300, 100);
    } 
}

そして、私のスレッドクラスは次のとおりです。

public class Element extends Thread {


    public void run() {

        // do something to get an object from another class (a queue)
    }
}

今、スレッドクラスに定期的にリリースする方法を本当に混乱させています。wait()/notify() を使用するかどうかさえわかりませんでした。

前に言ったように、複数の Element クラスを作成します。それらは同期して動作します。じゃあどうすればいいの?

4

1 に答える 1

0

ミューテックスを表すオブジェクトのリストを作成します。各要素スレッドはリストから 1 つのミューテックスを取得し、タイマー タスクはリストを取得します。

期間が満了すると、TimerTask はすべてのミューテックス オブジェクトで notify() を呼び出します。これにより、Element スレッドが起動されます。

要素スレッドはキューからのデータを処理し、完了すると、それぞれのミューテックス オブジェクトで wait() を呼び出します。

複数のコンシューマーがあるため、スレッド セーフをキューに組み込む必要がありますが、TimerTask によって処理されるため、ブロッキング ロジックは必要ありません。

また、私の理解が正しければ、Elements がデータを処理するときに、何かをキューに戻してほしいと考えています。そのためには、要素が完了した後に最初のキューに排出できる補助キューを使用するか、単にそれらを交換することができます (これは TimerTask によって行われ、Element がウェイクアップするとインクリメントされ、デクリメントされるアトミックカウンターが必要です。寝るため)。または、要素を起動する直前にキューに入れることができる「停止」値を使用して、要素が到達するまで機能させることができます。N 個の要素のスレッドの場合、すべてのスレッドがメッセージを受け取るように、N 個の停止値を設定する必要があります。

ミューテックスの使用方法:

List<Object> mutexList;
//initialize the list with plain Objects. You just need them to be separate instances.
....
//When creating Element threads add one object from the list to each Element.
....
//in Element code
public class Element extends Thread {
   //This is one element from the list 
   private Object mutex;


    public void run() {
       // do something to get an object from another class (a queue)
       //....
       synchronized(mutex){ 
          mutex.wait();
       }
    }
}
// in timerTask code
 public class PeriodicTime extends TimerTask {

    List<Object> mutexList;

    @Override
    public void run() {

        if(counter > 0) {
            //do some stuff to wake up threads
           for(Object mutex:mutexList){
                mutex.notify();
           }
        }
        counter++;
    }
}
于 2014-12-26T14:29:43.080 に答える