1

複数の投稿を読んでいましたが、質問に対する明確な答えを見つけることができませんでした。

開始ボタンと停止ボタンと jTextArea だけを持つアプリケーション (メイン フレーム) があります。ユーザーが「開始」ボタンを押すと、SwingWorker クラスがインスタンス化され、タスクが実行 (execute()) されます。そのタスクは、データベースに接続していくつかのチェックを行うことです。すべてのチェックで、jTextArea が正しく更新され、すべて問題ありません。停止ボタンが押されると、isCancelled() を true に設定すると、バックグラウンド プロセスが停止します (実行を停止するために SwingWorker 内で適切なチェックを行っています)。

私がやりたいことは、ユーザーが「開始」を押すと、SwingWorker が実行を開始し、数分間スリープしてから同じタスクを再実行することです。「停止」ボタンを押すと、すべてが停止します。

どうすればそれを達成できますか?SwingWorker バックグラウンド プロセスが 1 回実行されることになっていることを理解しています。これを行う他の方法は何でしょうか?SwingWorker を選んだ理由は、バックグラウンド プロセスの実行中に jTextArea を更新したかったからです。

前もって感謝します。

4

2 に答える 2

5

SwingWorker は、例外なく 1 回だけ実行できます。考えられる解決策は次のとおりです。

  • 必要になるたびに新しい SwingWorker オブジェクトを作成して実行し、完了したら停止して破棄します。
  • プログラムの実行中に単一の SwingWorker を実行し、停止が押されたときにキャンセルせずに一時停止ます (方法は、コードの非 Swing 部分によって異なりますが、これについてはわかりません)。再生を押します。これには、状態設計パターンがうまく機能します。

ご発言につきましては、

私がやりたいことは、ユーザーが「開始」を押すと、SwingWorker が実行を開始し、数分間スリープしてから同じタスクを再実行することです。「停止」ボタンを押すと、すべてが停止します。

これには、SwingWorker 内で ScheduledExecutorService を使用することを検討してください。ScheduledExecutorService はScheduledFuture<V>、必要に応じてキャンセルできる を作成します。



あなたのコメントと私の応答を編集します。

ScheduledExecutorService によってバックグラウンド プロセスが複数回実行されることはありませんか?

いいえ。バックグラウンド プロセスは 1 回実行されます。ScheduledExecutorService によって作成された Future も作成され、スケジュールされた時間に実行されます。

たとえば、遅延が前回の反復の実行にかかった時間よりも短い場合はどうなるでしょうか?

複数の Future が作成され、同時に実行が開始されます。

Thread.Sleep() を使用して doInBackground() 内で while ループを使用する必要がありますか?

現在のプロジェクトについて私たちが知っている情報に基づいて判断するのは非常に困難です。これは機能する可能性がありますが、より複雑なニーズの場合は、いいえ、ScheduledExecutorService を使用することをお勧めします。

于 2013-09-09T21:25:48.037 に答える
0

私は通常、swingworker 内でループを使用しますが、正常に動作します。

グローバル変数

private boolean monitor = true;

Swingworker クラス

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 は停止する前にすべてのタスクを完了できます。

于 2013-11-16T05:29:18.617 に答える