gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:19:17 25 4
gpt4 key购买 nike

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

最佳答案

我同意@Chris K,这里的关键是使用阻塞队列,我尝试编写一个高级解决方案:用于任务A的DBThread和用于任务B的PrinterThread,以及在之间共享的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();
}
}

关于java - 如何在java中并行运行2个任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37855049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com