gpt4 book ai didi

Java 线程可运行/可调用

转载 作者:行者123 更新时间:2023-12-01 04:46:37 24 4
gpt4 key购买 nike

我当前的项目涉及通过各种 TCP 协议(protocol)将网络流量发送到多个不同的主机。我计划将其设为“插件”类型设计,可以通过实现我的接口(interface)来编写不同协议(protocol)的插件并在运行时添加。

下面是我的初始设计,我希望有经验的开发人员提供一些指导,特别是关于我是否以正确的方式进行线程处理,以及如何与我的 Swing GUI“对话”。

我的主类是我的 GUI,它扩展了 JFrame 并使用 Netbeans 创建。单击按钮,我想加载模块(在本例中是 SSH - 不用担心我已经完成的模块的加载)。

按钮点击的代码如下:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Executor executor = Executors.newCachedThreadPool();
PluginWorker worker = new PluginWorker();
executor.execute(worker);
}

那么首先,这个Executor需要调用我的worker吗?我可以在这里使用 SwingWorker 来从我的 Swing GUI 中取消执行吗?

以下代码是我的PluginWorker类,它是一个旨在启动网络探测线程的类,我不确定是否需要它? SwingWorker 可能适合这个?此外,任务数组列表的大小很容易达到 10,000,这就是我选择使用 invokeAll 函数的原因?最佳实践是什么?

public class PluginWorker implements Runnable {
private final ExecutorService es = Executors.newFixedThreadPool(5);
private final Collection<GenericPlugin> tasks = new ArrayList<>();


@Override
public void run() {

SshPlugin ssh = new SshPlugin();
tasks.add(ssh);
//tasks could easily be up to 10,000 in size, so thats why I have chosen to use the invokeAll function?

try {
es.invokeAll(tasks);
} catch (InterruptedException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
es.shutdown();
}
}

最后,我希望任何人都可以编写我的 SshPlugin,它扩展了“GenericPlugin”,它实现了我的“Plugin”接口(interface)(这样我就可以强制执行 getAuthor、getDescription 等函数),并且还实现了“Callable”。这是必需的,以便我可以从数组列表运行 invokeAll。现在我担心的是我的插件设计过度了,我真的需要从 GenericPlugin 扩展吗?我的 SSHPlugin 直接实现“插件”和“可调用”本身会更好吗?

最佳答案

您的问题的简短回答是:每当您与 GUI 交互并且需要通过 GUI 中的持续更新来完成某些后台任务时,您应该使用 javax.swing.SwingWorker。通过阅读官方教程 Worker Threads and SwingWorker,您可以了解如何高效且有效地使用 javax.swing.SwingWorker

关于Java 线程可运行/可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15720927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com