我有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中完成。如果可能,任何代码段都会有所帮助。 感谢
答案 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();
}
}