Java Threading Runnable / Callable

时间:2013-03-30 16:40:47

标签: java multithreading

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

1 个答案:

答案 0 :(得分:0)

您的问题的简短回答是:每当您与GUI交互并且某些后台任务要在GUI中进行持续更新时,您应该使用javax.swing.SwingWorker。通过阅读此官方教程Worker Threads and SwingWorker

,您可以高效,有效地了解如何使用javax.swing.SwingWorker