gpt4 book ai didi

java - 在 Java 中,如何在每个线程中运行不同的方法?

转载 作者:行者123 更新时间:2023-11-29 06:24:00 25 4
gpt4 key购买 nike

更新:我混合使用了 extraneon 和 Jarrod Roberson 的答案。

我目前有四种方法要同时运行。它们是对数据库的四个查询。

我需要实现四个类,每个类都有一个带有所需查询的 run() 或者有其他方法可以做到这一点?

编辑:这些方法将更新程序中的统计信息,并在名为 StatisticsDB 的类中实现(下面的这些方法来自 Facade,因为这些方法比这更大)。我有一个类将更新在后台线程中运行的统计信息。我想要这样的东西,每个线程可以是一个连接。

public void updateStatistics(){
//these methods running at same time
pages = getQuantityVisitedPages();
links = getQuantityFoundLinks();
blinks = getQuantityBrokenLinks();
flinks = getQuantityFilteredLinks();
}

public String getQuantityVisitedPages(Connection conn) {
statisticsDB = new StatisticsDB();
return statisticsDB.getQuantityVisitedPages(conn);
}

public String getQuantityFoundLinks(Connection conn) {
statisticsDB = new StatisticsDB();
return statisticsDB.getQuantityFoundLinks(conn);
}

public String getQuantityBrokenLinks(Connection conn) {
statisticsDB = new StatisticsDB();
return statisticsDB.getQuantityFilteredLinks(conn);
}

public String getQuantityFilteredLinks(Connection conn) {
statisticsDB = new StatisticsDB();
return statisticsDB.getQuantityFilteredLinks(conn);
}

最佳答案

使用 Future使用 Callable 和 ExecutorService。

// Don't use the connection on all queries at the same time
// unless that's allowed.
Future<String> f1 = executor.submit(new Callable<String>() {
public String call() {
return getQuantityVisitedPages( createConnection() );
}});
Future<String> f2 = executor.submit(new Callable<String>() {
public String call() {
return getQuantityFoundLinks( createConnection() );
}});


try {
// wait until f1 is finished and get the result
// in the mean time all queries are running
String qvp = f1.get();
String qfl = f2.get();
} catch (ExecutionException ex) { cleanup(); return; }

// do something with found values

编辑

需要说明的是 - 如果单个查询失败,您现在将一无所有。如果您可以忍受缺少一个结果,您只需包装 try - 捕获每一个 get()。

get() 正在阻塞(尽管可以选择超时。因此,如果在此期间确定了结果,f2.get() 将立即返回,否则它将等到 f2 也准备好。

如果您想在查询完成后立即更新 GUI,请更新可调用的 gui 部分,或者使用 SwingWorker 代替 future。

一定要小心类成员变量——并发访问共享状态可能很棘手。这就是为什么我警告过这种联系。如果您使用连接池,请从池中为每个调用提供自己的连接。

get() 语义声明当异常发生时它被包装在 ExecutionException 中。只需找出 cause() 并确定应该做什么。

至于合适的执行人,我认为new Executors.newFixedThreadPool(4)会很好地服务,或者如果您认为会有更多查询,请使用 newCachedThreadPool。查询对您的 CPU 来说不是那么密集(尽管它们是针对数据库服务器),所以一些额外的线程并不是真正的问题,因为它们无论如何都在等待数据库结果。

关于java - 在 Java 中,如何在每个线程中运行不同的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6102118/

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