我目前的项目涉及通过各种TCP协议将网络流量发送到多个不同的主机。我打算把它变成一个“插件”式设计,通过实现我的界面并在运行时添加,可以编写不同协议的插件。
下面是我的初步设计,如果我正在以正确的方式进行线程化,我想要更多经验丰富的开发人员的一些指示,以及如何“回调”到我的Swing GUI。
My Main类是我的GUI,它扩展了JFrame并使用Netbeans创建。在按钮上单击我想加载模块(在这个例子中SSH - 我不担心加载我完成的模块)。
点击按钮的代码如下:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Executor executor = Executors.newCachedThreadPool();
PluginWorker worker = new PluginWorker();
executor.execute(worker);
}
首先,这个执行官需要打电话给我的工作人员吗?我可以在这里使用SwingWorker来执行我的Swing GUI吗?
以下代码是我的PluginWorker类,它是一个专门用于启动网络探测线程的类,我不确定是否需要它? SwingWorker可能适合这个吗?任务的arraylist也可以轻松达到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”,它实现了我的“插件”接口(因此我可以强制执行getAuthor,getDescription等功能)并实现“Callable”。这是必需的,所以我可以从arraylist运行invokeAll。现在我的担心是我的插件过度设计,我真的需要从GenericPlugin扩展,我的SSHPlugin直接实现“插件”和“可调用”本身会更好吗?
答案 0 :(得分:0)
您的问题的简短回答是:每当您与GUI交互并且某些后台任务要在GUI中进行持续更新时,您应该使用javax.swing.SwingWorker
。通过阅读此官方教程Worker Threads and SwingWorker
javax.swing.SwingWorker