java - GUI 和持久后端之间的通信(在单独的线程中运行)

标签 java multithreading synchronization producer-consumer

您好,我知道有很多关于它的问题和一些相关的答案。就像从后端使用 SwingUtilities.invokeLater 将响应返回到 GUI JTextArea 一样并使用 blocking queue 将消息传递到后端。我可以使用这个。

但我想跳过实现队列的消息解析器。我想知道是否可以直接从另一个线程调用方法。好的部分答案是 call method using class implements runnable但它只能启动单个任务线程。我正在寻找的是一个持久对象,它接受从另一个线程调用的更多方法并执行序列化。

更具体地说:
第一个线程是 GUI,具有多个按钮,如“打开设备”、“将 reg A 设置为用户输入”、“将 reg B 设置为用户输入”、“启用功能 X”、“flash FW”...

第二个是一个工作线程 - 它已经完成,由多个类组成。并且具有需要从 GUI 调用的方法。

我需要以下属性
- 工作线程只有 1 个,并且在所有 GUI 调用中保持不变
- 所有 GUI 调用均应序列化(只有在第一个调用完全处理并返回后才开始另一个调用)
- 工作线程应该能够将一些“日志消息”发送到 GUI(例如刷新固件的百分比)(这可能可以通过 SwingUtilities.invokeLater 轻松完成)

有没有比实现队列解析器更好的方法调用方法?如果有的话你能提供一些好的例子的链接吗?或者队列是完成此任务的正确方法吗?如果队列是正确的方法,如何最好地编码不同的参数?例如,“闪存固件”按钮需要传递"file",“将 reg A 设置为值 XY”按钮需要传递字节...

最佳答案

您可以使用Executors.newSingleThreadExecutor()创建一个Executor来运行任务。一旦你有了 Executor 实例,你就可以向它发送 Runnable 对象。任务将排队,每个任务将在下一个任务开始之前运行完成,所有任务都使用相同的工作线程。 例如,在 UI 线程中,您可以将任务发送到执行器,如下所示:

ExecutorService executor = Executors.newSingleThreadExecutor();
...
JButton b1 = new JButton("doTask1");
b1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) { 
        executor.execute(yourRunnable1);
    });
});

JButton b2 = new JButton("doTask2");
b2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) { 
        executor.execute(yourRunnable2);
    });
});

关于java - GUI 和持久后端之间的通信(在单独的线程中运行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28949208/

相关文章:

java - 同步器困惑

java - Elasticsearch + Log4j2 + Spring 关闭问题

java - 如何从 .jar Android 加载类

java - 重复 SwingWorker

c# - 线程 C# 中的 Task.Delay

c# - 如何在不阻塞主线程的情况下将 Thread.Sleep 与 Task.Run 一起使用

java - 如何使用 Java Stream 获取属于列表中元素的平面元素列表

java - 使用 Hibernate 设置与数据库无关的默认列时间戳

android - android sqlite数据库和mysql数据库如何离线和在线同步数据?

android - 由于未知的下载问题,同步 Gradle 失败