Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can Java';可以从被动类而不是线程使用s倒计时锁存器吗?_Java_Concurrency_Countdownlatch - Fatal编程技术网

Can Java';可以从被动类而不是线程使用s倒计时锁存器吗?

Can Java';可以从被动类而不是线程使用s倒计时锁存器吗?,java,concurrency,countdownlatch,Java,Concurrency,Countdownlatch,所以我在做这个程序,它模拟一天的工作,每个工人都有自己的线程。我正在尝试实施工人参加会议的会议,但会议要等到所有应该参加会议的人都到了才开始。所以我有这个参加会议的方法 公开作废出席会议(员工){ 这个.cdStart.countDown(); worker.meetingWait(); 试一试{ 这个.cdStart.await(); worker.meetingStart(此长度); if(this.attendes.get(0).equals(worker)){ 这个。房间。出口(); }

所以我在做这个程序,它模拟一天的工作,每个工人都有自己的线程。我正在尝试实施工人参加会议的会议,但会议要等到所有应该参加会议的人都到了才开始。所以我有这个参加会议的方法

公开作废出席会议(员工){
这个.cdStart.countDown();
worker.meetingWait();
试一试{
这个.cdStart.await();
worker.meetingStart(此长度);
if(this.attendes.get(0).equals(worker)){
这个。房间。出口();
}//如果结束,则结束
}//结束尝试
捕获(中断异常错误){
//无所事事
}//端盖
}//结束方法AttendedMeeting

worker参数是扩展Thread的Employee类的实例,this.cdStart是CountDownLatch。但是,当在四名员工的会议上运行此命令时,似乎只有一名员工能够进入,减少计数,并执行wait()调用。其他工作线程似乎都无法进入它。我确实注意到,许多在线使用示例都将CountDownLock对象传递给线程自己来处理。有没有理由不这样做?

我假设您在Employee thread对象中有一个线程传递。该单个线程将无限期地等待,直到N个参与方到达(除了员工线程之外,每个员工实例都需要一个单独的线程)。这意味着,如果只有一个线程持续通过员工/线程,那么在会议上等待的员工将永远不会超过一名

相反,此线程最多应该向员工线程发出参加会议的信号

你应该在会议课上有门闩,让他们在门闩上等待。这也需要对其工作方式进行轻微的重组

将会议实例传递给员工,让该线程等待

    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();
     } 
   }  
然而,我认为这是一个障碍。虽然你不会再使用它,但自行车车的工作方式更适合你正在尝试做的事情,会议课看起来会是这样的

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

     public void waitForAllOthersToArrive(){
         barrier.await(); //when await() is called numberOfEmployees then all waiting threads will awake
     }
 }

worker.meetingWait()是做什么的?我有一个主要负责Employee类的队友,他提到他希望在整个会议期间更新员工的状态,包括员工是否正在参加活动会议或只是等待。这就是meetingWait()和meetingStart()方法的用途。+1绝对更适合。通常意味着分别等待和倒计时线程。我可能应该在问题中提到这一点。会议的施工人员会列出要参加会议的员工名单。当会议室可用时,会议室将召开会议并对会议对象调用startMeeting()方法,该方法反过来对列表中的所有Employee对象调用meetingRequest()方法@DavidMarkness使用倒计时锁存器的原因是每次会议都使用一个新的会议对象。由于meeting对象或多或少地封装了一个事件,因此使用Countdownlock似乎比CyclicBarrier更合适。@grg-n-sox好的,您知道为什么您的程序只会有一个员工到达吗?您需要的是调用方法的Employee线程,该方法具有闩锁
await()
ing。然后将挂起员工线程,而不是启动会议的主线程。因此,启动会议的这个主线程应该通知线程等待会议开始,你所拥有的是线程启动正在等待所有其他线程等待会议,显然它必须是另一种方式。我想我明白你的意思了,但你一直在提到一个开始会议的主线。但是,在这种情况下,由员工自己决定何时需要召开会议,无论是谁初始化会议,都会尝试将会议添加到会议室中,如果会议室是空的,则会议立即开始,如果会议室是满的,会议被添加到BlockingQueue。我想当我提到主线程时,我指的是启动会议的线程。线程第一次尝试等待员工时,实际上是暂停了自己的线程,无法取得进一步的进展。因此,正如我提到的,您宁愿通知其他员工参加/等待会议开始。