一个简单的任务调度例子

最近有一个活,需要调度一些任务(Task),然后每个任务需要多线程运行它的子任务(thread)。最近学习java.util.concurrent的东西,于是使用里面的类实现了这样一个功能

用到的主要是Executors.newFixedThreadPool 就是一个固定大小的线程池
还有就是CountDownLatch 用来同步 测试的代码如下,看里面的代码和注释就比较清楚了。

  public static void Test2() {
    ExecutorService tasks = Executors.newFixedThreadPool(5);  //最多同时执行5个任务的任务线程池。

    List<String> allTasks = new ArrayList<String> ();  //模拟20个任务
    for (int i = 0; i < 20; i++) {
      allTasks.add("Task" + i);
    }
    final CountDownLatch taskLatch = new CountDownLatch(allTasks.size());  //用来同步的信号量
    for (int i = 0; i < allTasks.size(); i++) {   //对于每一个任务
      final String task = allTasks.get(i);
      final List<String> allThreads = new ArrayList<String> (); //模拟每个任务的子任务(线程)。
      for (int j = 0; j < 5; j++) {
        allThreads.add("thread" + j);
      }
     
      final CountDownLatch threadLatch = new CountDownLatch(allThreads.size()); //子任务的同步
      tasks.execute(new Runnable() {   //启动所有任务
        public void run() {
          logger.info("Start Task: " + task);  //实际任务开始
          ExecutorService threads = Executors.newFixedThreadPool(2); //每个任务有两个线程的线程池
          for (String th : allThreads) {
            Runnable thread = new CheckThread2(task, th,threadLatch);
            threads.execute(thread);

          }
          try {
            threadLatch.await();    //等待子任务完成
          }
          catch (InterruptedException ex) {
          }

          taskLatch.countDown();   //通知别人,这个任务完成
          threads.shutdownNow();   //本任务完成了,可以关闭线程池
          logger.info(task + " finished.");

        }
      });

    }
    try {
      taskLatch.await();  //等待所有任务完成
    }
    catch (InterruptedException ex) {
    }
    logger.info("All Tasks Finished.");
    tasks.shutdownNow();  //所有任务完成了,可以关闭线程池了。


  }

class CheckThread2
    implements Runnable {
  private String task;
  private String thread;
  private  CountDownLatch threadLatch;
  public CheckThread2(String task, String thread,CountDownLatch threadLatch) {
    this.task=task;
    this.thread=thread;
    this.threadLatch=threadLatch;
  }

  public void run() {
    System.out.println("starting " + task + "->" + thread);  //任务的子任务实际开始
    try {
      Thread.sleep(new java.util.Random().nextInt(10) * 1000); //模拟一个费时的任务
    }
    catch (InterruptedException ex) {
    }
    System.out.println("finishing " + task + "->" + thread);  //任务完成
    this.threadLatch.countDown();  //通知任务,本子任务完成了。
   
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值