gpt4 book ai didi

Java 线程 : Specifying what should be executed in the run function

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

我有一个连接到数据库的 DBAdmin 类,然后是一些其他类,例如 ArticleCategory 等等,对数据库执行某些查询。

我在 Swing 应用程序中使用这些类来构建一种小型 Intranet CMS 应用程序。

现在,Category类有一堆static方法,比如addCategoryeditCategory等,像这样:

public class Category implements Runnable {

public void run () {
//Code that will be executed in a separate thread, from the Runnable Interface
}

public static int addCategory(Category cat) {
DBAdmin db = DBAdmin.getInstance();
db.connectDB();
//rest of the code that creates sql statement and so on...
}

//Other static edit and delete methods that will be called from outside
}

附言DBAdmin 是一个单例类,getInstance 方法返回自己调用的实例。

现在,我要做的是数据库操作应该在应用程序的单独线程中运行,并且我设法做了一些在 run 方法中运行的示例测试当一个线程启动时。

但问题是我无法在线程启动时在run方法中指定应该运行哪个方法。

从某种意义上说,例如当从外部调用 addCategory 时,run 方法应该调用它内部的 addCategory 方法。

有没有办法将一个函数作为回调参数从 addCategory 方法传递给 run 方法,以便它知道在启动新线程时应该在其中调用哪个函数?还是有一种完全不同的方式来实现我想要做的事情?

附言在这一点上,我对 Java 还“相当”陌生,尤其是多线程,所以我可能在这里遗漏了一些东西。

最佳答案

听起来你想要的是一个单一的线程来完成整个程序的所有数据库访问,在这种情况下你不应该将东西传递给运行方法。因为当你有一个线程时,它所做的只是在它启动时调用一次 run 方法,并且该 run 方法一直执行直到它返回或线程被强行终止。做这种事情的方法是在您的 DBAdmin 类中有一个同步队列。然后像 addCategory 这样的方法会准备它们的语句并将它们添加到这个共享队列中。单个数据库线程一次处理队列中的语句,当一条语句完成时,它会通知将它添加到队列中的线程。事实上,Java(至少最近的版本)包含一组可以为您完成这些工作的类;它们被称为执行器,它们可以在 java.util.concurrent 包中找到。具体来说,看看 java.util.concurrent.Executors.newSingleThreadExecutor() 方法,这是我在这种情况下使用的方法。

class SQLQueryCallable implements Callable<SQLResultSet> {
private String query;
public SQLQueryCallable(String query) {
this.query = query;
}
public SQLResultSet Call() throws Exception {
// execute query
return results;
}
}
ExecutorService ex = Executors.newSingleThreadExecutor();

// in DBAdmin somewhere:
public SQLResultSet runQuery(String query) {
Future<SQLResultSet> f = ex.submit(new SQLQueryCallable(query));
return f.get(); // this waits for the query to complete
}

如果我一直在误读您的问题,而您实际上希望每个数据库查询都在其自己的线程中执行,那么我建议创建一个名为 SQLQuery 之类的类,它实现 Runnable(或扩展 Thread)——实际上,您甚至可以考虑使用 java.util.concurrent.Callable,它允许您从其 call() 方法(类似于 run())返回一个值。类构造函数应该将 SQL 语句作为参数,并且它的 run 方法应该完成执行该语句的工作。然后,如果您使用了 Callable,则可以返回语句的结果,或者如果您使用了 Runnable,则可以将其存储在一些通常可访问的位置。这就是您所问问题的简单答案,即如何将数据传递给 run() 方法:使用类构造函数。

class SQLQueryRunnable implements Runnable {
private String query;
public SQLQueryRunnable(String query) {
this.query = query;
}
public void run() {
// execute query
}
}

附言多线程很难适应,但 Java 是一种很好的语言(我认为)。

关于Java 线程 : Specifying what should be executed in the run function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/464214/

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