4

だから私は仕事で一日をシミュレートするこのプログラムに取り組んでおり、各ワーカーは独自のスレッドです。労働者が会議に出席する会議を実施しようとしていますが、会議に出席することになっている全員が到着するまで会議は開始されません。だから私は会議に出席するためのこの方法を持っています。

public void attendMeeting(Employee worker){
    this.cdStart.countDown();
    worker.meetingWait();
    try {
        this.cdStart.await();
        worker.meetingStart(this.length);
        if(this.attendees.get(0).equals(worker)){
            this.room.exit();
        } // end if

    } // end try
    catch (InterruptedException err) {
        // Do Nothing

    } // end catch

} // end method attendMeeting

Threadを拡張するEmployeeクラスのインスタンスであるworkerパラメーターとthis.cdStartはCountDownLatchです。ただし、4人の従業員の会議でこれを実行すると、1人の従業員だけが参加してカウントをデクリメントし、await()呼び出しをヒットできるように見えます。他のワーカースレッドはどれもそれを入力できないようです。オンラインでの使用例の多くが、CountDownLockオブジェクトをスレッド自体に渡して処理することに気づきました。これが代わりに機能しない理由はありますか?

4

1 に答える 1

4

EmployeeThreadオブジェクトに単一のスレッドパスがあると想定しています。その単一のスレッドは、N個のパーティが到着するまで無期限に待機します(Employeeスレッドとは別に、Employeeインスタンスごとに個別のスレッドが必要です)。これは、1つのスレッドだけが継続的に従業員/スレッドを通過している場合、会議で待機している従業員が1人を超えることは決してないことを意味します。

代わりに、このスレッドは、せいぜい、会議に参加するように従業員スレッドに通知する必要があります。

ミーティングクラスにラッチを設定し、そのラッチで待機させる必要があります。これには、動作方法のわずかな再構築も必要です。

MeetingインスタンスをEmployeeに渡して、そのスレッドを待機させます。

    public Employee extends Thread{

     //define this at some point whether in constructor or a 
     //means of notifying the thread to attend the meeting
      private Meeting meeting;

      public void run(){
          //do some stuff until this employee is ready to go  to a meeting

         meeting.waitForAllOthersToArrive();
      }

    }

   public class Meeting{  
     CountDownLatch latch =  new CountDownLatch(numberOfEmployees);

     public void waitForAllOthersToArrive(){
        latch.countDown();
        latch.await();
     } 
   }  

ただし、これについて私が提案するのはCylicBarrierです。再利用することはありませんが、CyclicBarrierの動作は、実行しようとしていることによりよく適合します。その場合、Meetingクラスは次のようになります。

 public class Meeting{
     CylicBarrier barrier = new CylicBarrier(numberOfEmployees);

     public void waitForAllOthersToArrive(){
         barrier.await(); //when await() is called numberOfEmployees then all waiting threads will awake
     }
 }
于 2012-04-18T16:57:28.897 に答える