我有一个DBAdmin
连接到数据库的类,然后是一些其他类,例如Article
,Category
等等,它们对数据库执行某些查询.
我在Swing应用程序中使用这些类来构建一种小型Intranet CMS应用程序.
现在,Category
该类有一堆static
方法,如addCategory
,editCategory
等等,如下所示:
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 }
PS DBAdmin
是一个Singleton类,该getInstance
方法返回自调用的实例.
现在,我想要做的是,数据库操作应该从应用程序单独的线程上运行,而我没做到这一点是在运行一些样本检验run
方法,当Thread
是started
.
但问题是我无法指定在run
启动线程时应该在方法中运行哪个方法.
从某种意义上说,当addCategory
从外部run
调用时,该方法应调用其中的addCategory
方法.
有没有办法可以将一个函数作为回调参数从addCategory
方法传递给run方法,以便在启动新线程时知道应该在其中调用哪个函数?或者是否有一种完全不同的方式来实现我想要做的事情?
PS我现在对Java很"相当",特别是多线程,所以我可能会在这里遗漏一些东西.
听起来你想要的是一个单个线程,它为整个程序进行所有数据库访问,在这种情况下,你不应该将事物传递给run方法.因为当你有一个单独的线程时,它所做的就是在启动时调用一次运行方法,并且run方法只是一直执行,直到它返回或线程被强制终止.执行此类操作的方法是在DBAdmin类中具有同步队列.然后像addCategory这样的方法会准备它们的语句并将它们添加到这个共享队列中.单个数据库线程一次处理一个队列中的语句,当语句完成时,它会通知将其添加到队列中的线程.事实上,Java(至少是最近的版本)包含一组将完全适合您的类; 他们' 称为Executors,它们可以在java.util.concurrent包中找到.具体来说,请查看java.util.concurrent.Executors.newSingleThreadExecutor()方法,这是我用于这种情况的方法.
class SQLQueryCallable implements Callable{ 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 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 } }
PS多线程是一个很难习惯的东西,但Java是一个很好的语言(我认为).