0

我有一个 MainClass、一个 Worker 类和一个 Supervisor 类。在 MainClass 中,我创建了 10 个 Worker 类和一个在不同线程中运行的 Supervisor 类。

class MainClass {

   public static void main(String args[]) {

   for (int i=0; i<10 ;i++) {
      Thread t = new Thread( new Worker());
      t.start();
   }

   (new Thread(new Supervisor()).start();

}

.

class Worker extends Thread {
  public void run() {
    while(true) {
      if(some_condition) {
        //do stuff
      } else {
        // pause thread execution for undefined time.
      }
    }
  }
}

.

class Supervisor extends Thread {
  public void run() {
    while(true) {
      if(some_condition) {
        // restart Workers thread that are paused.
      } 
      // do other stuff
    }
  }
}

我不知道如何实现这一点,因为每个线程中的条件都是相互独立的,所以我不需要同步,所以我不能使用等待通知。

4

2 回答 2

0

根据我的理解,您希望根据您的要求创建由 10 个工作人员或数量组成的单独线程池。

就池而言,您可以ThreadPoolExecutorjava.util.concurrentapi 中检查。在内部ThreadPoolexecutor还为运行任务创建工作线程。

尝试阅读ThreadPoolExecutor它可能会对您有所帮助,或者请详细说明您希望通过此问题实现的最终目标是什么。

于 2013-11-10T14:07:16.323 回答
0

我不知道如何实现这一点,因为每个线程中的条件都是相互独立的,所以我不需要同步,所以我不能使用等待通知。

你当然可以。

这里的微妙之处在于,它可能Supervisor实际上并不知道工作线程是否真的被暂停了。(如果是,则条件不是独立的。)

由于 Supervisor 不知道线程是否实际暂停(通过假设),因此如果它试图取消暂停已经取消暂停的线程,您必须设计您想要发生的事情。

a) unpause 应该什么都不做吗?

b) 还是应该在工人下次尝试暂停时立即取消暂停?

如果答案是(b),那么你就不得不担心线程安全了。如果答案是 (a),那么您不需要(除非您有一些其他数据要在线程之间传递!

无论哪种方式,您仍然可以使用等待和通知。

于 2013-11-10T14:10:07.277 回答