6

SwingWorkerのこれらの 2 つのメソッドは 、現時点で私を混乱させており、誤って使用するのは非常に簡単なようです。

メソッドpublish()は、次のことを説明します。

process(java.util.List) メソッドにデータ チャンクを送信します。このメソッドは、doInBackground メソッド内から使用され、プロセス メソッド内のイベント ディスパッチ スレッドで処理するための中間結果を提供します。

これが意味することは、ワーカー スレッドがそのdoInBackground()メソッドを実行している間に、「チャンク」を作成できることです (これらは特定のものである必要がありますか、それともメッセージ オブジェクトを参照するための単なる方法ですか?)。私のSwing GUIで処理するため。

それは私をprocess()に導きます。javadoc では、次の概要が説明されています。

イベント ディスパッチ スレッドで、publish メソッドからデータ チャンクを非同期的に受信します。

両方の方法のドキュメントに目を通した後、これがどのように行われているかの背後にあるメカニズムを誰かが明確にすることができますか? ドキュメントによると非同期プロセスであることは理解していますが、EDT で行われているため、ある程度の予測可能性があると思います。

publish()ドキュメントには次のように記載されています。

プロセス メソッドはイベント ディスパッチ スレッドで非同期的に呼び出されるため、プロセス メソッドが実行される前に、パブリッシュ メソッドへの複数の呼び出しが発生する可能性があります。パフォーマンス上の理由から、これらの呼び出しはすべて、連結された引数を持つ 1 つの呼び出しに結合されます。

要約すると、私の質問は 2 つあります。

  • 誰が電話する必要がありprocess()ますか?
  • process()SwingWorker と EDT のコンテキストでのワークフローは何ですか?

説明が必要な場合はお知らせください。

4

2 に答える 2

5

サブツリー内のディレクトリを処理するプログラムを作成しました。処理には十分な時間がかかり、ユーザーは何かが起こっているというフィードバックを必要とします。現在処理中のサブディレクトリの名前を示すラベルを含むダイアログを表示しました。処理中の各ディレクトリの名前で publish() と呼ばれる swingworker スレッド。

ディレクトリ名ごとに UI が更新されるという保証はありません。特にコンピューターで何か他のことが起こっている場合や、実行しているコンピューターによっては、再表示よりも処理が速くなることがあります。そのため、Swing ランタイムによって process() が呼び出されなくても、publish() が呼び出されて数回実行される可能性があります。

すでに指摘したように、プロセスはコードによって呼び出されるのではなく、publish() を呼び出すたびにではなく、publish を呼び出した後に呼び出されます。

それはあなたのために物事を片付けますか?

于 2013-08-30T14:42:44.080 に答える
3

process() メソッドで処理するデータを追加するには、publish() を呼び出す必要があります。

publish メソッドは、任意のスレッドから呼び出すことができます。

process メソッドは EDT スレッド内で実行されるため、EDT スレッド内からのみ許可されている GUI を変更できます。したがって、process() メソッドを自分で呼び出すべきではありません。

process() が何をしなければならないかを決めるのはあなた次第ですが、これは EDT スレッドで実行されているため、非常に迅速に終了するはずです。

于 2013-08-30T14:46:31.067 に答える