наиболее эффективный способ использования ExecutorService - PullRequest
0 голосов
/ 27 февраля 2012

В моей программе я написал класс, который обновляет группу слушателей каждый раз, когда срабатывает новое значение. Поэтому я использую 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, поэтому мне интересно, правильно ли я его использую. Я имею в виду, он каждый раз создает новый Runnable объект, верно? Даже Исполнитель использует только один-единственный поток.

Заранее спасибо за любую помощь и просвещение. nyyrikki

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Ваш код в порядке с точки зрения производительности.Вы не объясняете, что является источником 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();
                    }   
                }
            }
    }
1 голос
/ 27 февраля 2012

Это именно то, что вы должны делать.Java довольно быстро создает подобные объекты;темы могут быть дорогими, но просто создать Runnable, как вы делаете здесь, дешево.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...