Java线程调度

时间:2013-11-10 13:59:07

标签: java multithreading synchronization

我有一个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
    }
  }
}

我不知道如何实现这个,导致每个线程中的条件彼此独立,所以我不需要同步,所以我不能使用wait-notify。

2 个答案:

答案 0 :(得分:0)

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

就游泳池而言,您可以在ThreadPoolExecutor api中查看java.util.concurrent。内部ThreadPoolexecutor还为运行任务创建工作线程。

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

答案 1 :(得分:0)

  

我不知道如何实现这个,导致每个线程中的条件彼此独立,所以我不需要同步,所以我不能使用wait-notify。

当然可以。

这里的细微之处在于,大概Supervisor实际上并不知道工作线程是否真的暂停了。 (如果确实如此,那么条件独立。)

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

a)取消暂停应该什么都不做?

b)或者是否应该在下次工人试图暂停时立即取消暂停?

如果答案是(b),那么你必须担心线程安全。如果答案是(a),那么你不会(除非你在线程之间传递一些其他数据!

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