作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 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/
我是一名优秀的程序员,十分优秀!