[英]Repeat the execution of a SwingWorker in Java
我正在閱讀多個帖子,但找不到清晰的答案。
我有一個應用程序(主機),它具有一個開始和一個停止按鈕以及一個jTextArea。 當用戶按下“開始”按鈕時,將實例化SwingWorker類並運行(execute())任務。 該任務是連接到數據庫並進行一些檢查。 對於每次檢查,它都會正確更新jTextArea,一切都很好。 當按下停止按鈕時,我將isCancelled()設置為true,因此后台進程停止(我在SwingWorker內部進行了適當的檢查以停止執行等)。
我想做的是,當用戶按下“開始”時,SwingWorker開始執行,睡眠幾分鍾,然后重新運行相同的任務。 當按下“停止”按鈕時,一切停止。
我該如何實現? 我知道SwingWorker后台進程應該運行一次。 這樣做的其他方式是什么? 請注意,之所以選擇SwingWorker是因為我想在后台進程運行時更新jTextArea。
先感謝您。
您只能一次運行SwingWorker,無一例外。 可能的解決方案包括:
關於您的聲明,
我想做的是,當用戶按下“開始”時,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.