如何在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中实现这一点。如果可能的话,任何代码片段都会很有帮助。如何在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中实现这一点
感谢我同意@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