2013-03-30 58 views
1

我目前的项目涉及通过各种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本身直接实现“插件”和“可调用”会更好吗?

+0

我不确定该按钮的actionPerformed()是否需要使用Executor。可能,但取决于创建和启动10,000个任务需要多长时间。 – user949300

回答

0

您的问题的简短答案是:每当您与GUI进行交互并且一些后台任务将通过GUI中的连续更新完成时,则应使用javax.swing.SwingWorker。您可以通过阅读官方教程,了解如何高效地使用javax.swing.SwingWorkerWorker Threads and SwingWorker

+0

所以我应该用SwingWorker来替换我的PluginWorker(它实现了可运行的),但是我仍然需要在任务级别进一步进行线程化。我目前的方法是否适用于第二层线程? – fixulate

+0

所以你的意思是你点击按钮后按顺序执行许多线程..? –

+0

是的,可能在插件级别有10,000个任务。所以我知道我需要首先远离GUI,其次,启动10,000个任务。 – fixulate