簡體   English   中英

Java線程可運行/可調用

[英]Java Threading Runnable / Callable

我當前的項目涉及通過各種TCP協議將網絡流量發送到多個不同的主機。 我正計划使其成為“插件”類型的設計,其中可以通過實現我的界面來編寫用於不同協議的插件,並在運行時添加它們。

下面是我的初始設計,我想從更有經驗的開發人員那里獲得一些建議,特別是關於我是否以正確的方式進行線程化,以及如何“回聊”我的Swing GUI。

我的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可能適合於此嗎? 任務的數組列表也可以輕松地達到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”接口(因此我可以強制執行諸如getAuthor,getDescription等的功能),並且還實現“ Callable”。 這是必需的,因此我可以從arraylist運行invokeAll。 現在,我擔心的是我的插件設計過度,是否真的需要從GenericPlugin擴展,對於我的SSHPlugin來說,直接實現“插件”和“可調用”本身會更好嗎?

您的問題的簡短答案是:每當您與GUI交互並且要通過GUI中的連續更新來完成某些后台任務時,都應該使用javax.swing.SwingWorker 通過閱讀此官方教程Worker Threads and SwingWorker您可以了解如何有效地使用javax.swing.SwingWorker

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM