2017-02-28 1 views
0

私は実際にJava concuremcyを読んでいます。今私は9.1章を達成します。しかし、私はJavaでGUIアプリケーションを開発していませんでした。本からレガシーJavaアプリケーションでの「メインイベントループ」の様子[JCIP 9.1]

引用:

なぜGUIはシングルスレッドですか?

昔、GUIアプリケーションはシングルスレッドで、GUIイベント は「メインイベントループ」から処理されました。最新のGUIフレームワークでは、わずかに異なる モデルが使用されます。GUIイベントを処理する専用のイベント ディスパッチスレッド(EDT)を作成します。

私は昔は開発者ではなかったので、GUIアプリケーションで「メインイベントループ」が何を意味するのか分かりません。また、私は明確な説明に私は応答しません。

このレガシー技術の例を表示できますか?タスクを生成して消費するキューがありますか?

答えて

1

はい、いずれの場合も、タスクが処理されるのを待っているキューと、そのタスクを1つずつ実行するスレッドがあります。

メインイベントループとは、ループの中で、アプリケーションのすべてのタスク(UIとI/Oや数値計算などのアプリケーションの他のすべての側面)を処理する専用スレッドを意味します。 このプログラミングモデルは、単一スレッドであるためスレッド同期を必要としないので便利です。とにかく、昔はコンピュータが単一のCPUを持っていて、マルチスレッド化はあまり効果がありませんでした。

最近、イベントディスパッチスレッド(EDT)はUI要求のみを処理し、I/Oと数値計算を並行して実行します。一般的に、これは、スレッドの同期が必要ですが、EDTとの通信は、単純なまま:

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
    //Code to change Swing data. 
    } 
}); 

あなたはまだ、アプリケーションのすべてのタスクのためのUIだけでなくEDTを使用することができ、場合にあなたのアプリケーションは、軽量で、EDTの過負荷を希望UIを遅くしない。

+0

** invokeLater **はEDTと並列に呼び出しますか? – gstackoverflow

+0

はい、invokeLater(task)は任意のスレッドから呼び出すことができます。このメソッドは、単にEDTイベントキューにタスクをポストします。 EDTはそのキューからタスクを1つずつ取り出し、task.run()を呼び出します。 –

+0

@gstackoverflow 'invokeLater'は物事をEDTで*実行するために使用されます。 EDTから発生しなければならないUIとのすべての対話。 EDTと並行して実行されているスレッドから 'invokeLater'を呼び出して、いくつかの処理を委譲することができます。 –

関連する問題