1

これは主に理論的な問題です。以下の例は私が考えさせられたものですが、最良の例ではないかもしれません. 以下の理由は具体的なものであり、現時点では回避できないと想定してください。

私が実行しているプログラムには、プログラムの起動時に作成されるオプションのデバッグ フレームがあり、ユーザーがボタン/キーボード ショートカットを押すと表示されます。

私の問題は、EDT に長いプロセスがあるため、何らかの理由でハングしている場合や失敗した場合、そのスレッドの実行が終了するのを待たずにすぐに確認して、Debug Log Frame を更新することです。

私の解決策は、別々のスレッドによって更新される 2 つの別々の GUI に対して 2 つの別々の EDT を用意することです。

これは可能ですか、それともできませんか? 方法を教えてくれるオンライン リソースが見つかりません。EDT はシングル スレッドにする必要があることはわかっていますが、スレッドをほぐしておく場合、2 つにすることはできますか? お願いします?

4

1 に答える 1

5

答えは簡単です。いいえ、 EDTを 2 つ持つことはできません。それは不可能です。しかし、フリーズした GUI で立ち往生しているわけではなく、いくつかのオプションを利用できます。

まず、2 つの重要なルールがあります。

  1. EDT で長い計算を行わないでください。これまで。
  2. EDT の外部から Swing コンポーネントを操作しないでください。これまで。

最初の規則に違反すると、GUI がフリーズし、その間はいかなる種類のイベントも処理されません。これには、計算中に実行したい GUI の更新が含まれますが、これは計算が完了するまで表示されません。

後者はしばしば無視され、ほとんどの場合気付かれませんが、お尻を噛む可能性があり、実際に噛む可能性があり、ほとんどの場合、戻って修正するのは大きなピタです. ですから、最初から正しい方法で行ってください。何が起こる可能性がありますか?EDT と他のスレッドとの間にデッドロックがあるため、コンポーネントが突然壊れた状態で表示されたり、白く表示されたり、アプリケーション全体がフリーズしたりする可能性があります。Oracle Swing スレッディング ポリシーを遵守してください。


では、たとえばユーザーがボタンを押した後に EDT で長い計算を行うのを避けるにはどうすればよいでしょうか? オプション:

  • SwingWorkerを使用します。利点:done()ワーカーが完了すると、EDT で自動的に実行される使用可能なメソッドがあります。インターフェイスも実装しているFutureため、結果を返すために使用できます。
  • Runnable独自のものを作成して、そこで計算を行うことができます。
  • Java が並列実行のために提供するその他の方法を使用してください。

では、EDT の外部から GUI を操作しないようにするにはどうすればよいでしょうか?

  • SwingUtilities.invokeLater()そこで Swing 操作を呼び出して実行します。
  • done()上記のように SwingWorkers メソッドを使用します。

これら 2 つのルールに従えば、Swing GUI ははるかに優れた形になり、Swing の問題ではなく、アプリケーション開発にもっと集中できます。

于 2013-05-10T10:00:43.027 に答える