您好,我知道有很多关于它的问题和一些相关的答案。就像从后端使用 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/