如何在java中并行运行 2个任务?
How to run 2 tasks in parallel in java?
我有 2 个任务,任务 A 和任务 B。 Task-A 有一个 return 类型的 ResultSet 并且 return 一次从 DB 获取 1000 行。这个任务是 运行 10 次,因为数据库有 10,000 行(还要考虑数据库中总行数未知的情况)。 Task-B 有 void return 类型并且只是做 Sysout。我需要将 Task-A 编辑的前 1000 行 return 传递给 Task-B,并且当 Task-B 对这些行进行操作时,我希望 Task-A 并行地 运行 以便通过当任务 B 完成对前 1000 条记录的操作时,下一组 1000 条记录应该由任务 A 编辑 return。
请告诉我如何在 java 中完成此操作。如果可能,任何代码片段都会有所帮助。
谢谢
我同意@Chris K,这里的关键是使用阻塞队列,我尝试编写一个高级解决方案:Task-A 的 DBThread 和 Task-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();
}
}
我有 2 个任务,任务 A 和任务 B。 Task-A 有一个 return 类型的 ResultSet 并且 return 一次从 DB 获取 1000 行。这个任务是 运行 10 次,因为数据库有 10,000 行(还要考虑数据库中总行数未知的情况)。 Task-B 有 void return 类型并且只是做 Sysout。我需要将 Task-A 编辑的前 1000 行 return 传递给 Task-B,并且当 Task-B 对这些行进行操作时,我希望 Task-A 并行地 运行 以便通过当任务 B 完成对前 1000 条记录的操作时,下一组 1000 条记录应该由任务 A 编辑 return。 请告诉我如何在 java 中完成此操作。如果可能,任何代码片段都会有所帮助。 谢谢
我同意@Chris K,这里的关键是使用阻塞队列,我尝试编写一个高级解决方案:Task-A 的 DBThread 和 Task-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();
}
}