当前位置:  开发笔记 > 编程语言 > 正文

Java线程:指定应在run函数中执行的内容

如何解决《Java线程:指定应在run函数中执行的内容》经验,为你挑选了1个好方法。

我有一个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方法,当Threadstarted.

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

从某种意义上说,当addCategory从外部run调用时,该方法应调用其中的addCategory方法.

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

PS我现在对Java很"相当",特别是多线程,所以我可能会在这里遗漏一些东西.



1> David Z..:

听起来你想要的是一个单个线程,它为整个程序进行所有数据库访问,在这种情况下,你不应该将事物传递给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是一个很好的语言(我认为).

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有