Разве этот SwingWorker не использует темы в ThreadPoolExecutor повторно? - PullRequest
2 голосов
/ 23 июня 2010

В рамках моего проекта «Последний год» я разработал настольное приложение, которое вписывается в категорию «графических IDE», если такая вещь существует.Я реализовал небольшое подмножество Визуального словаря Джесси Джеймса Гарретта для информационной архитектуры и проектирования взаимодействий , чтобы пользователь мог нарисовать диаграмму (ориентированный граф, другими словами), отражающую опыт пользователя в веб-приложении, назначитьHTML-шаблоны для страниц и запись некоторого кода в соединитель / переход, который будет выполнен, как только приложение скомпилировано и пользователь щелкнет соответствующую гиперссылку.

(я не могу опубликовать более одной гиперссылки, но яЯ имею в виду страницы и коннекторы, такие как Элементы пользовательского опыта, описанные в Визуальном Словаре JJG)

Поэтому я использую другой SwingWorkers для генерации набора исходных файлов C ++, в которые преобразуется диаграмма.Просматривая журналы, я вижу, что мое приложение всегда создает новые потоки, а не использует их повторно.

15:29:55.750 [SwingWorker-pool-2-thread-26] DEBUG i.v.a.ui.worker.ConnectorGenerator - Building source code for transition: connector_29
15:29:55.750 [SwingWorker-pool-2-thread-26] DEBUG i.v.a.ui.worker.ConnectorGenerator - Project retrieved: sasdasdasd
15:29:55.750 [SwingWorker-pool-2-thread-26] INFO  i.v.a.webapp.htcpp.CTransition - Generated C:\Workspaces\PFC\aedifico-ui\sasdasdasd\connector_29_action.h...
15:29:55.750 [SwingWorker-pool-2-thread-26] INFO  i.v.a.webapp.htcpp.CTransition - Generated C:\Workspaces\PFC\aedifico-ui\sasdasdasd\connector_29_action.cpp...
15:29:55.750 [SwingWorker-pool-2-thread-26] DEBUG i.v.a.ui.worker.ConnectorGenerator - Transition generated at: C:\Workspaces\PFC\aedifico-ui\sasdasdasd/connector_29_action.cpp

Все мои работники выполняют одни и те же две вещи:

  1. Создание пары исходных и заголовочных файлов C ++ с использованием механизма шаблонов Freemarker.

  2. Отправка сообщений на EDT через механизм публикации, чтобы информировать пользователя о том, как идут дела.

Полагаю, я тщательно кодировал SwingWorker s.Меня особенно беспокоило, что экземпляры FileWriter не закрываются должным образом, но я не вижу причины, по которой ThreadPoolExecutor не использует повторно созданные ранее потоки.

Волшебство происходит в ConnectorGenerator.BaseWorker расширяет SwingWorker<V,T> и содержит только поведение для связи с компонентом для отображения сообщений пользователю.

public class ConnectorGenerator<Void> extends BaseWorker<Void> {
    @Override
    public Void doInBackground() {
        Transition transition = connector.getModel().getTransition();
        logger.debug("Building source code for transition: {}", transition.getName());    
        logger.debug("Project retrieved: {}", project.getName());
        try {
            publish("Generating transition (%s) source code at %s", transition.getName(), project.getBaseDir());
            /**
             * Transition.build(String), attached below, is responsible of generating and writing the files
             */
            transition.build(project.getBaseDir().getPath());
            publish("Transition generated.");
        } catch (BuilderException e) {
            logger.error("Error: {}", e);
            publish("There was an error that prevented generating %s's source code", transition.getName());
        }
        logger.debug("Transition generated at: {}/{}", project.getBaseDir(), transition.getSource());

        return null;
    }
}

И метод Transition.build(String), включая попытку "ужасно, как ад"Блок -catch-finally:

@Override
public void build(String path) throws BuilderException {            
    generateFile(String.format("%s%s%s", path, File.separator, getHeader()), "action.h.ftl");
    generateFile(String.format("%s%s%s", path, File.separator, getSource()), "action.cpp.ftl");     
}

private void generateFile(String path, String templateName) throws BuilderException {
    FileWriter out = null;
    try {
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("transition", this);
        Configuration config = new Configuration();
        config.setClassForTemplateLoading(CTransition.class, "/");
        config.setObjectWrapper(ObjectWrapper.DEFAULT_WRAPPER);

        out = new FileWriter(path);
        freemarker.template.Template template = config.getTemplate(templateName);
        template.process(model, out, ObjectWrapper.BEANS_WRAPPER);
        stdout.info("Generated {}...", path);           
    } catch (IOException e) {
        throw new BuilderException(e);
    } catch (TemplateException e) {
        throw new BuilderException(e);
} finally {
        if (out != null)
            try {
                out.flush();
                out.close();
            } catch (IOException e) {
                throw new BuilderException(e);
            }
}       
}

Кто-нибудь видит или знает что-то, чего я, вероятно, пропускаю?

1 Ответ

1 голос
/ 23 июня 2010
...