使用ExecutorService最有效的方法

时间:2012-02-26 20:23:43

标签: java executorservice

在我的程序中,我编写了一个类,每次触发新值时都会更新一堆监听器。因此我使用SingleThreadExecutor,示例应该更清楚。我担心的是,当我像那样运行时,它是否有意义:

Class Update() {
    ExecutorService svc = Executors.newSingleThreadExecutor();

    svc.execute(new Runnable() {
        public void run() {
            if(!theListeners.isEmpty()) {
                for(IgpsdListener l : theListeners) {
                    l.update(jsonObject);
                }   
            }
        }
    });

我听说,在JAVA中创建Threads是相当昂贵的动作,所以我想知道我是否正确使用它。我的意思是,它每次创建一个新的Runnable对象时都会创建吗?甚至Executor也只使用唯一的线程。

提前感谢任何帮助和启发。 nyyrikki

2 个答案:

答案 0 :(得分:1)

这正是你应该做的。 Java在创建像这样的一次性对象方面非常快;线程可能很昂贵,但只是像你这样创建一个Runnable便宜。

答案 1 :(得分:1)

就性能而言,您的代码很好。您没有解释jsonObject的来源是什么,但是如果您的Runnable是无状态的,那么您也可能只创建一个实例(可能不是这样,但仍然值得知道)

例如,如果这是您的整个代码:

class Update() {

    private final List<IgpsdListener> theListeners = //...

    private ExecutorService svc = Executors.newSingleThreadExecutor();

    svc.execute(new Runnable() {
        public void run() {
            if(!theListeners.isEmpty()) {
                for(IgpsdListener l : theListeners) {
                    l.update();
                }   
            }
        }
    });

这可以简化为:

class Update() {

    private final List<IgpsdListener> theListeners = //...

    private ExecutorService svc = Executors.newSingleThreadExecutor();

    final Notifier notifier = new Notifier()

    //execute this as many times as you want with the same notififer instance
    svc.execute(notififer);

    class Notifier implements Runnable {
            public void run() {
                if(!theListeners.isEmpty()) {
                    for(IgpsdListener l : theListeners) {
                        l.update();
                    }   
                }
            }
    }