在同一类的两个不同实例上定义的线程之间的通信?

时间:2014-04-14 07:49:03

标签: java multithreading

我有一个类(比如说)Task.java执行一些任务调度活动。 此类包含两种类型的活动 - 1)安排定期任务和2)安排非周期性任务。 周期性任务优先于非周期性。

public class Task implements Runnable{
  ArrayList<> list;
  public Task(ArrayList<> list){
    this.list = list;
  }
public void run(){
    handlePeriodicTask(){...}
    handleAPeriodicTask(){...}
  }
}

在主类中,我有一个包含周期性和非周期性任务的全局任务列表。我将此列表拆分为两个子列表,每个子列表包含不同的周期性任务,但可能重复非周期性任务。我将这些子列表提供给在Task.java

的两个不同实例上创建的两个不同线程
public class Main{
  ArrayList<> globalList;

  //splitting globalList to get two sublists
  ArrayList<> subList1; 
  ArrayList<> subList2;
  public static void main(..){
     Task task1 = new Task(subList1);

     Task task2 = new Task(subList1);
     new Thread(task1).start();
     new Thread(task2).start();
  }
}

我希望两个子列表中的所有周期性任务能够独立调度,无论是非周期性的(因为它们本质上是非周期性的),如果已经由另一个线程调度,则需要先验知识。如果是这样,当前线程应该忽略它们。 我不知道如何通过wait() notify()在两个不同实例上创建的两个线程上实现此通信。我已经看到了几个在单个实例上运行的wait() notify()的例子,但是如何在两个不同的实例上实现这一点。我不太熟悉多线程,所以这个问题可能很愚蠢/无效,但我希望得到适当的指导。 有人请指导我。 感谢。

1 个答案:

答案 0 :(得分:0)

永远不要独立启动线程,如果您尝试实现的解决方案将导致生成太多线程。最好使用线程池管理器(Executor Service - Link)。这将帮助您实现多种功能 - 以更加可控的方式启动线程,根据环境配置线程数(poolize),以及跨所有平台管理线程的可靠机制。您可以将所有定期任务提供给ExecutorService以启动。