我目前的项目涉及通过各种TCP协议将网络流量发送到多个不同的主机。我打算将其设计为“插件”类型的设计,其中可以通过实现我的界面来编写针对不同协议的插件,并在运行时添加。Java线程可运行/可调用
下面是我最初的设计,我想从有经验的开发人员的一些专门的指针上,如果我穿了正确的方法,以及如何“顶嘴”我的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);
}
所以,首先,有没有需要在此执行程序调用我的工人?我可以在这里使用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”它实现我的“插件”接口(所以我可以执行像getAuthor,getDescription等功能),并且还实现了“可调用” 。这是需要的,所以我可以从数组列表中运行invokeAll。现在我的担心是我的插件过度设计,我是否真的需要从GenericPlugin扩展,我的SSHPlugin本身直接实现“插件”和“可调用”会更好吗?
我不确定该按钮的actionPerformed()是否需要使用Executor。可能,但取决于创建和启动10,000个任务需要多长时间。 – user949300