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

如何在java中并行运行两个任务?,java,multithreading,executorservice,Java,Multithreading,Executorservice,我有两个任务,Task-A和Task-B。Task-A的返回类型为ResultSet,并且从DB一次返回1000行。此任务将运行10次,因为DB有10000行(也考虑DB中的总NOT是未知的情况)。Task-B具有void返回类型,只执行Sysout。我需要将Task-A返回的前1000行传递给Task-B,由于Task-B正在这些行上运行,我希望Task-A并行运行,以便在Task-B完成对前1000条记录的操作时,Task-A应该返回下一组1000条记录。 请告诉我如何在java中实现这一点

我有两个任务,Task-A和Task-B。Task-A的返回类型为ResultSet,并且从DB一次返回1000行。此任务将运行10次,因为DB有10000行(也考虑DB中的总NOT是未知的情况)。Task-B具有void返回类型,只执行Sysout。我需要将Task-A返回的前1000行传递给Task-B,由于Task-B正在这些行上运行,我希望Task-A并行运行,以便在Task-B完成对前1000条记录的操作时,Task-A应该返回下一组1000条记录。 请告诉我如何在java中实现这一点。如果可能的话,任何代码片段都会很有帮助。
感谢

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

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();
   }
}
classdbthread扩展线程{
私有阻塞队列结果集;
公共数据库线程(阻止队列结果集){
this.resultSets=结果集;
}
公开募捐{
试一试{
resultSets.put(getResultsFromDB());//如果队列已满,resultSets.put()调用将被阻止
}捕捉(中断异常e){
e、 printStackTrace();
}
}
私有结果集getResultsFromDB(){
ResultSet ResultSet=fromDB();//从数据库获取ResultSet的一些方法
返回结果集;
}
}
类PrinterThread扩展线程{
私有阻塞队列结果集;
公共PrinterThread(阻止队列结果集){
this.resultSets=结果集;
}
公开募捐{
试一试{
printLogs(resultSets.take());//如果队列为空,resultSets.take()调用将被阻止
}捕捉(中断异常e){
e、 printStackTrace();
}
}
私有void打印日志(ResultSet ResultSet){
//打印行
}
}
班长{
公共静态void main(字符串[]args){
BlockingQueue resultSets=新的LinkedBlockingQueue(10);
DBThread DBThread=新的DBThread(结果集);
PrinterThread PrinterThread=新的PrinterThread(结果集);
dbThread.start();
printerThread.start();
}
}

看看创建两个线程(一个使用者和一个生产者)并通过队列进行通信。这里的示例:两个任务是指两个线程吗?如果不是,那么看看这个,因为它很好地展示了如何在Java8中使用lambdas轻松地启动单独的线程,谢谢!这似乎解决了我的问题,我会试试:)@chrisk