0

メイン オブジェクト (Swing GUI を含む) と、オブジェクトの handle() メソッドを呼び出すサポート スレッドを備えたアプリがあります。

スレッドが handle() メソッドを使用している間、handle() メソッドが同期されると、メイン オブジェクトの GUI が応答しないことに気付きました。コード:

public synchronized void handle()){
//method code
}

handle() から synchronized キーワードを削除すると、スレッドが handle() メソッドを使用している場合でも、GUI は応答します。

注目すべき興味深い点は、別のオブジェクトをロックとして使用すると、スレッドが handle() メソッドを使用しているときに GUI が再び応答するようになることです。コード:

public void handle(){
    synchronized(anotherObj){
    //method code
    }
}

これは、Swing GUI が同期されたメソッドを使用していることを示唆しています。私は正しいですか?お気軽にリソースを教えてください。欲しいものがまったく見つかりませんでした。

ありがとう。

4

1 に答える 1

2

あなたの「ハンドル」メソッドは何ですか?それは何をしますか? 私は、Swing はほとんどの部分で同期を使用していないと考えており、そのドキュメントには、実際には API でスレッドセーフではないと記載されています (たとえば、こちらを参照してください)。代わりに、ユーザーの対話とプログラムの描画、EDT またはイベント ディスパッチ スレッドに単一のスレッドを使用し、Swing と対話するすべてのプログラムは、EDT でほとんどすべての Swing 呼び出しを呼び出すことによって、この単一のスレッド モデルを尊重する必要があります。これがあなたの問題があるところだと思います。

Swing スレッド化とバックグラウンド スレッドの使用の詳細については、こちらをご覧ください: Swing の同時実行性

編集 1
(私のコメントから) また、このメソッドが同期される理由を尋ねなければなりませんか? すべての Swing 呼び出しをイベント キューにキューイングするため、これはおそらく必要なく、有害である可能性があります。ほとんどの場合、Swing プログラムのフリーズは並行性の問題が原因であるため、この議論は関連しています。

問題 (GUI フリーズ) を示す小さなコンパイル可能なテスト プログラム ( SSCCE ) を作成し、ここに投稿して、自分でテストできるようにすることをお勧めします。

于 2011-07-31T04:25:40.740 に答える