这SwingWorker不是重用ThreadPoolExecutor中的线程吗?

2024-02-27

作为我的毕业项目的一部分,我开发了一个桌面应用程序,如果存在的话,它属于“图形 IDE”类别。我已经实现了一小部分Jessy James Garrett 信息架构和交互设计视觉词汇 http://www.jjg.net/ia/visvocab/,因此用户可以绘制一个图表(换句话说,有向图)来表示用户在 Web 应用程序中的体验,将 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小心点。我特别担心 FileWriter 实例没有按预期关闭,但我看不出原因ThreadPoolExecutor不重用之前创建的线程。

魔法发生在ConnectorGenerator. The 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;
    }
}

And the Transition.build(String)方法,包括一个丑陋的 try-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);
            }
}       
}

有人看到或知道我可能错过的东西吗?


也许这对你来说很有趣:由于 SwingWorker 池中的一个线程而导致 SwingWorker 死锁 https://bugs.java.com/bugdatabase/view_bug?bug_id=6880336

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这SwingWorker不是重用ThreadPoolExecutor中的线程吗? 的相关文章

  • Java,顺序流在哪个线程中执行?

    在阅读有关流的文档时 我遇到了以下句子 attempting to access mutable state from behavioral parameters presents you with a bad choice if you
  • 类型已知,但方法指的是缺失类型

    我对 java 和 Eclipse 不太有经验 但遇到以下问题 我正在写类似的东西 Point3D myPoint myClass myMethod arg 我收到错误 方法 myMethod myType arg 引用缺失的类型 Poin
  • 是否可以使用 Java 读写 Parquet,而不依赖 Hadoop 和 HDFS?

    我一直在寻找这个问题的解决方案 在我看来 如果不引入对 HDFS 和 Hadoop 的依赖 就无法在 Java 程序中嵌入读写 Parquet 格式 它是否正确 我想在 Hadoop 集群之外的客户端计算机上进行读写 我开始对 Apache
  • 如何从 Java 访问 Windows 设备管理器中的信息?

    我有一个串行 USB 设备 并且其中多个设备可以连接到计算机 我需要查询和检索设备连接到的 COM 端口列表 在 Windows 设备管理器中 您可以获得当前连接的设备的 COM 端口 友好名称 该列表是动态的 从注册表中读取不工作 htt
  • 如何准确判断 double 是否为整数? [复制]

    这个问题在这里已经有答案了 具体来说 在 Java 中 我如何确定double是一个整数 为了澄清 我想知道如何确定 double 实际上不包含任何分数或小数 我主要关心的是浮点数的性质 我想到的方法 以及我通过谷歌找到的方法 基本上遵循以
  • 在 Eclipse 3.5 上安装旧版 TestNG 插件时出现问题

    我正在尝试在 eclipse 3 5 上安装 TestNG 5 11 并获得以下信息 eclipse buildId unknown java version 1 6 0 19 java vendor Sun Microsystems In
  • 使用全局变量从内部函数获取空字符串

    请帮助我解决一些小问题 我确信你能做到 D 我试图在 firestore 文档 user cases information 上设置一个字段 其中包含一个字段 case number 首先我声明这个全局变量 private String c
  • Java Junit 测试 HTTP POST 请求

    我需要测试以下方法而不改变方法本身 该方法向服务器发出 POST 方法 但我需要制作一个独立于服务器的测试用例 在将其重定向到本地文件之前 我测试了类似的方法 但为此我将协议指定为文件 主机名指定为 localhost 端口指定为 1 我的
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • java项目中无法加载类“org.slf4j.impl.StaticLoggerBinder”错误? [复制]

    这个问题在这里已经有答案了 我越来越Failed to load class org slf4j impl StaticLoggerBinder 错误 我想将记录器写入文件 所以我使用了 log4j jar 并使用 apache tomca
  • 使用 Jena 查询维基数据

    目前 Wikidata 有一个 SPARQL 端点 https query wikidata org https query wikidata org 我想使用 Jena 3 0 1 查询此网站 我使用以下代码 但收到错误消息 端点返回的
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • 膨胀类 android.support.design.widget.NavigationView 时出错

    我按照 NavigationView 的教程进行操作 但无法解决此错误消息 Error inflating class android support design widget NavigationView 教程链接 https www
  • 如何让“循环”泛型在 Java 中工作?

    我在编译以下涉及一些泛型的代码时遇到错误 public abstract class State
  • Java HashSet 是线程安全的只读吗?

    如果我通过 Collections unmodifyingSet 运行 HashSet 实例后 它是线程安全的吗 我问这个是因为 Set 文档声明它不是 但我只是执行读取操作 来自 Javadoc 请注意 此实现不是同步的 如果多个线程同时
  • 接口是否像对象一样对待?

    为什么下面的代码可以工作 interface I class A implements I public String toString return in a class B extends A public String toStrin
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • 如何使用eclipse调试JSP tomcat服务?

    我想使用 Eclipse IDE 调试器来调试单独运行的 JSP Struts Tomcat Hibernate 应用程序堆栈 如何设置 java JVM 和 eclipse 以便设置断点 监视变量值并查看当前正在执行的代码 我刚刚用谷歌搜
  • 在java中执行匿名pl/sql块并获取结果集

    我想执行匿名 PL SQL 并需要获取结果集对象 我得到了可以通过在 PL SQL 块内使用游标来完成的代码 但 PL SQL 块本身将以文本形式来自数据库 所以我无法编辑该 PL SQL 块 并且它只会返回两个值 其列名始终相同 它将返回
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF

随机推荐