Нить безопасный сервис для выполнения задач в очереди


Отвечая на вопрос о Итак, я дал этот пример. Намерение состояло в том, чтобы обеспечить потокобезопасность службы, очередей просит каталогах. Я полагал, что я мог определенно использовать некоторые комментарий на мое использование многопоточности, синглтоны и общие навыки программирования на Java.

package mkdir;

import java.io.File;
import java.util.concurrent.ConcurrentLinkedQueue;

public class MkDirService implements Runnable {

    private static MkDirService service;
    private static ConcurrentLinkedQueue<File> pendingDirs;


    private MkDirService() {
        pendingDirs = new ConcurrentLinkedQueue<File>();
    }

    public static MkDirService getService() {
        if (service == null) {
            service = new MkDirService();
            new Thread(service).start();
        }
        return service;

    }

    public void makeDir(File dir) {
        pendingDirs.add(dir);
    }

    @Override
    public void run() {
        while (true) {
            while (!pendingDirs.isEmpty())
            {
                File curDir = pendingDirs.poll();
                if (curDir !=null && !curDir.exists()) {
                    curDir.mkdir();
                }
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

}


893
5
задан 4 марта 2011 в 05:03 Источник Поделиться
Комментарии
2 ответа

pendingDirs не должны быть статичными. Одно дело поддерживать статический экземпляр реализовать синглтон, но этот объект должен взаимодействовать с государством, используя обычные переменные экземпляра. И вы можете также инициализировать его в свою декларацию, а не конструктор.

Служба должна создавать поток, а не создавать его в getService() , чтобы сделать его самодостаточным. Это позволяет другой реализации, чтобы использовать пул потоков для параллельного создания каталогов и упрощает тестирование.

getService() не является потокобезопасным и может позволить два или несколько экземпляров, которые будут созданы.

Использовать блокирующие очереди, так что вам не придется опрашивать и спать. Нить будет усыплять, если очередь пуста и проснуться после того, как новый каталог добавляется в очередь. Это позволит сократить цикл выполнения в несколько строк и позволяют опираться на хорошо проверенные потока управления в Ява.утиль.одновременно.

2
ответ дан 4 марта 2011 в 07:03 Источник Поделиться

Также, чтобы создать еще один поток рекомендуется использовать concurrent пакет:
Душеприказчики.newSingleThreadExecutor().представить(новый MkDirService());

2
ответ дан 4 марта 2011 в 06:03 Источник Поделиться