如何在java中并行运行2个任务?

时间:2016-06-16 09:24:31

标签: java multithreading executorservice

我有2个任务,Task-A和Task-B。 Task-A的返回类型为ResultSet,并且一次性从DB返回1000行。此任务将运行10次,因为DB有10,000行(还要考虑DB中的行总数未知的情况)。 Task-B有void返回类型,只是Sysout。我需要将Task-A返回的前1000行传递给Task-B,并且当Task-B在这些行上运行时,我希望Task-A并行运行,以便在Task-B完成操作时前1000条记录,Task-A应返回下一组1000条记录。 请告诉我如何在java中完成。如果可能,任何代码段都会有所帮助。 感谢

1 个答案:

答案 0 :(得分:1)

我同意@Chris K,这里的关键是使用阻塞队列,我试图编写一个高级解决方案:DBThread用于Task-A和PrinterThread用于Task-B,以及ResultSet的阻塞队列之间共享两个线程:

class DBThread extends Thread {
   private BlockingQueue<ResultSet> resultSets;
   public DBThread(BlockingQueue<ResultSet> resultSets) {
      this.resultSets = resultSets;
   }

   public void run() {
      try {
         resultSets.put(getResultsFromDB());  //resultSets.put() call will block if the queue is full
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
   }

   private ResultSet getResultsFromDB() {
      ResultSet resultSet = fromDB();   //some method to get ResultSet from DB
      return resultSet;
   }
}

class PrinterThread extends Thread  {
   private BlockingQueue<ResultSet> resultSets;
   public PrinterThread(BlockingQueue<ResultSet> resultSets) {
      this.resultSets = resultSets;
   }

   public void run() {
      try {
         printLogs(resultSets.take());  //resultSets.take() call will block if the queue is empty
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
   }

   private void printLogs(ResultSet resultSet) {
      //print rows
   }
}

class Main {

   public static void main(String[] args) {
      BlockingQueue<ResultSet> resultSets = new LinkedBlockingQueue<>(10);
      DBThread dbThread = new DBThread(resultSets);
      PrinterThread printerThread = new PrinterThread(resultSets);
      dbThread.start();
      printerThread.start();
   }
}