2011-08-01 15 views
0

Java同期質問

を私は外部のスレッドによってアクセスされる方法handle()、およびサーバーオブジェクトのから実行されている別の方法doThis()を含む、SwingのGUIを使用してサーバーオブジェクトを持っていますGUI。

私はスイングイベント処理がイベントディスパッチスレッド上で行われることを理解しています。実際にはdoThis()にアクセスするイベントディスパッチスレッドです。

doThis()handle()が干渉する可能性があります。これを回避するには、両方のメソッドを同期させる必要があります。これにより、イベントディスパッチスレッドと他の外部スレッドは、もう一方が完了する前にあるメソッドを呼び出すことができなくなります。

私の推論は正しいですか? the Java tutorial on synchronizationから

答えて

0

:これらのメソッドは同期化すること

は、2つの効果を有する:第一に、それはインターリーブする同じオブジェクトの同期メソッドの2つの呼び出しは可能ではありません。あるスレッドがオブジェクトの同期メソッドを実行しているとき、そのオブジェクトで最初のスレッドが完了するまで、同じオブジェクトブロックの同期メソッドを呼び出す他のすべてのスレッド(実行を中断)。 第2に、同期メソッドが終了すると、同じオブジェクトに対する同期メソッドの後続の呼び出しと自動的に「先行」関係が確立されます。これにより、オブジェクトの状態の変更がすべてのスレッドで認識できることが保証されます。

はい。

+0

それ自体では、Swing GUIで[生存](http://download.oracle.com/javase/tutorial/essential/concurrency/liveness.html)を維持するには不十分な場合があります。 – trashgod

1

代わりにSwingWorkerを使用してください。 TwoRootは簡単な例です。バックグラウンドにhandle()を置き、をprocess()に入れます。