簡體   English   中英

重復執行Java中的SwingWorker

[英]Repeat the execution of a SwingWorker in Java

我正在閱讀多個帖子,但找不到清晰的答案。

我有一個應用程序(主機),它具有一個開始和一個停止按鈕以及一個jTextArea。 當用戶按下“開始”按鈕時,將實例化SwingWorker類並運行(execute())任務。 該任務是連接到數據庫並進行一些檢查。 對於每次檢查,它都會正確更新jTextArea,一切都很好。 當按下停止按鈕時,我將isCancelled()設置為true,因此后台進程停止(我在SwingWorker內部進行了適當的檢查以停止執行等)。

我想做的是,當用戶按下“開始”時,SwingWorker開始執行,睡眠幾分鍾,然后重新運行相同的任務。 當按下“停止”按鈕時,一切停止。

我該如何實現? 我知道SwingWorker后台進程應該運行一次。 這樣做的其他方式是什么? 請注意,之所以選擇SwingWorker是因為我想在后台進程運行時更新jTextArea。

先感謝您。

您只能一次運行SwingWorker,無一例外。 可能的解決方案包括:

  • 每次需要一個新的SwingWorker對象時,運行它,並在完成后停止並丟棄它。
  • 在程序的整個運行過程中運行一個SwingWorker,不要在按下停止鍵時取消它,而要暫停它(這將取決於我們不知道的代碼的非SWING部分),並在出現時喚醒它播放被按下。 狀態設計模式可以很好地解決此問題。

關於您的聲明,

我想做的是,當用戶按下“開始”時,SwingWorker開始執行,睡眠幾分鍾,然后重新運行相同的任務。 當按下“停止”按鈕時,一切停止。

考慮在SwingWorker內部為此使用ScheduledExecutorService。 ScheduledExecutorService創建一個ScheduledFuture<V> ,如果需要可以將其取消。


編輯
您的評論和我的回復:

ScheduledExecutorService不會導致后台進程多次運行嗎?

否。后台進程將運行一次。 由ScheduledExecutorService創建的Future也將被創建,然后在其計划的時間運行。

例如,當延遲小於上一次迭代運行所花費的時間時,會發生什么?

將創建多個期貨並將同時開始運行。

我是否應該使用Thread.Sleep()在doInBackground()內部進行while循環?

根據我們對您當前項目的了解很難說。 是的,這可能會起作用,但是,對於更復雜的需求,如果不是,您可能想要使用ScheduledExecutorService。

我通常在swingworker內部使用一個循環,效果很好。

全局變量

private boolean monitor = true;

秋千班

private class MonitorQueue extends SwingWorker<Void, Void> {

    @Override
    protected Void doInBackground() throws Exception {
        while (monitor) {
            System.out.println("monitor");
            Thread.sleep(Constants.SECOND * 5);
        }
        return null;
    }
}

我具有的另一個優點是,我沒有設置停止或暫停SwingWorker本身,而是將monitor設置為false。 這將使SwingWorker在停止之前完成所有任務。

暫無
暫無

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

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