Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 此SwingWorker是否未重用ThreadPoolExecutor中的线程?_Java_Multithreading_Swingworker - Fatal编程技术网

Java 此SwingWorker是否未重用ThreadPoolExecutor中的线程?

Java 此SwingWorker是否未重用ThreadPoolExecutor中的线程?,java,multithreading,swingworker,Java,Multithreading,Swingworker,作为我最后一年项目的一部分,我开发了一个桌面应用程序,如果存在这样的东西,它就属于“图形IDE”的范畴。我已经实现了的一小部分,因此用户可以绘制一个图表(换句话说,是一个有向图),表示用户在webapp中的体验,为页面分配HTML模板,并向连接器/转换写入一些代码,一旦编译应用程序,用户单击相应的超链接,就会执行这些代码 (我不能发布多个超链接,但我指的是页面和连接器,如JJG的视觉词汇表中描述的用户体验元素) >我使用不同的SwitgWork来生成一组C++源文件,其中图表被翻译成。查看日志

作为我最后一年项目的一部分,我开发了一个桌面应用程序,如果存在这样的东西,它就属于“图形IDE”的范畴。我已经实现了的一小部分,因此用户可以绘制一个图表(换句话说,是一个有向图),表示用户在webapp中的体验,为页面分配HTML模板,并向连接器/转换写入一些代码,一旦编译应用程序,用户单击相应的超链接,就会执行这些代码

(我不能发布多个超链接,但我指的是页面和连接器,如JJG的视觉词汇表中描述的用户体验元素)

<> >我使用不同的SwitgWork来生成一组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
我所有的员工都做同样的两件事:

< L> > P>生成一对C++源文件和头文件 Freemarker模板引擎

  • 通过发送消息到
    EDT
    发布过程机制 通知用户情况如何 走吧

  • 我相信我对SwingWorker的编码很仔细。我特别担心FileWriter实例没有按预期关闭,但我看不出
    ThreadPoolExecutor
    没有重用以前创建的线程的原因

    神奇的事情发生在
    连接器生成器中。
    BaseWorker
    扩展了
    SwingWorker
    ,只保留与组件通信的行为,以便向用户显示消息

    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;
        }
    }
    

    有人看到或知道我可能缺少的东西吗?

    也许这对你来说很有趣:

    我在你的代码中没有看到你调用ThreadPoolExecutor的地方。@Romain,当你计划执行worker时会调用它:ConnectorGenerator worker=new ConnectorGenerator();worker.execute();我没有提到,SwingWorkers使用的ThreadPoolExecutor有10个线程,如果这10个线程正在运行任务,它只会创建更多线程。我将用我自己的ThreadPoolExecutor临时修复它,我不敢相信这真的发生了。:-)是的,这真的很烦人,他们没有在更新20中解决这个问题
    @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);
                }
    }       
    }