-1

Main.java から呼び出される JFrame コンストラクターがあります (JFrame のクラスは Page1.java です)。

movieSelection p1 = new movieSelection();
this.add(p1);
this.pack();
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);

movieChoose は JPanel を拡張したクラスで、Page1 のサブクラスです。JTextField と JButton を ActionListener で追加するコンストラクターで構成されます。

最終結果は次のようになります

Page1.java のコンストラクターの最後に追加するwhile(true) {};while(true);、最終結果は次のようここに画像の説明を入力 になります。大量のラグが発生します。

アクティビティモニターによると、これはプログラムが占有しているスペースの量です:

20 スレッド
261 ポート
CPU のほぼ 200%

この空の while ループはどのように行われるのでしょうか:
a) フレームに既に追加されている JPanel を台無しにし、
b) 大量の遅延を発生させますか?

何もしていないループが何かをするのはなぜですか?

4

6 に答える 6

3

Swing のすべての GUI はEDTで実行されるため

重いタスクでこのスレッドをブロックすると

例えば

while(true){

 };

その後、GUIは終了するまでフリーズしますが、コードは終了しないため終了しないため、GUIをレンダリングできません。

于 2013-08-03T20:46:04.217 に答える
0

何もしないだけではありません。ループしています。「かなりの遅延」と言うとき、アプリが完全にハングするという意味でしょうか? その while() にヒットすると何かをするなら、私は驚かれることでしょう。

于 2013-08-03T20:41:01.160 に答える
0

理論的にはループが無限に実行されているため、遅延が発生している可能性があります。おそらく、スレッドを一時停止してみてください。これにより、CPU に呼吸する時間が与えられます。

Thread.sleep(5);
于 2013-08-03T20:42:05.260 に答える
0

そのループは、値が true であるかどうかのチェックを決して停止しないためです... それが無限ループと呼ばれる理由です。すべてのサイクルは、ループを停止する必要があるかどうかを確認するために使用されます。

于 2013-08-03T20:41:08.253 に答える
0

空の (そして無限の) ループは、実際には多くのことを行います。ページをめくるように指示する紙のようなもので、裏面にも同じことが書かれています。

したがって、どのコンピューター言語でも決して空のループを実行しないでください。

あなたができることは次のようなものです

 while (true) {
    Thread.sleep(100);
 }

これで、メイン スレッドを実行できるようになりましたが、JVM に「わかりました。100 ミリ秒の間何かを実行するつもりはないので、必要に応じて別のことを実行してください」と伝えることができます。

しかし、まだ重要なことを見逃しています - いくつかの終了条件です。

そして、なぜ無限ループが必要なのですか? 通常の swing アプリケーションでは、メイン スレッドを実行し続ける必要はなく、JFrame が開いていれば十分です。http://docs.oracle.com/javase/tutorial/uiswing/components/frame.htmlでサンプル コードを確認できます。

于 2013-08-03T20:41:35.917 に答える
-1

非常に古いので、おそらく読んでいないかもしれませんが、ありがとうございます! 最も厄介な質問に答えました。(以前はデュアルコア プロセッサを使用していましたが、現在は単一のプロセッサに切り替えており、空の while {} ステートメントが機能しなくなりました!)

于 2015-01-21T05:02:57.687 に答える