1

こんにちは、Opp と Java の初心者です。

スレッドについて何かを見たことがあります。 Runnable を実装し、 start() を呼び出して run() を呼び出します。

しかし、これは何をしますか?

EventQueue

invokeLater();

または、メイン メソッドに関するこの投稿で見つけることができるこの完全な行: JPanel のアクティブな描画の上にある JTextFields、スレッド化の問題

メインメソッドでこれと同じ答え: JavaページフリッピングはMac OSでサポートされていませんか?

EventQueue.invokeLater(new NewTest());

それは run() メソッドを呼び出しますか? それとの違いは何ですか

Thread var = new Thread(this);
var.start();
4

2 に答える 2

4

Swing API はシングルスレッドです。swing スレッドから Swing コンポーネントのメソッドを呼び出すことだけが許可されています。

アプリケーションに複数のスレッドを含めることができますが、別のスレッドが swing コンポーネントとやり取りする必要がある場合は、 を使用して行う必要がありますEventQueue.invokeLater。これにより、Runnableが正しいスレッドで実行されることが保証されます。

独自に起動Threadしても (Swing スレッドで実行することによる) この効果は得られないため、代替手段ではありません。データが破損したり、画面が正しく更新されないなどの原因となります。

ただし、このメソッドは、渡されたinvokeLaterすべてが並列ではなく順番に実行されるため、独自のスレッドを実行したり、スレッド プールを使用したりする代わりにはなりません。Runnables

于 2014-05-09T08:38:56.553 に答える
0

私はスレッドについて何かを見てきました、Runnableを実装しています

あなたがそれを見たことを忘れてください。それは廃止すべき悪い考えでした。Java プログラムで明示的なスレッドを作成する場合は、次のようにします。

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        ...code to be run in the thread goes here...
    }
});

このスペースで理由を説明するつもりはありませんが、私を信じてください. 今すぐ始めるのは良い習慣です。

これは何をしますか?...invokeLater...

swing パッケージは、「イベント」(マウス クリック、キー押下など) に応答するスレッドを作成し、swing 用に記述した多くのコードは、そのスレッドによって呼び出される「ハンドラ」として実行されます。

ハンドラーが、呼び出されたコンテキストで許可されていない/意味をなさないことをしたい場合があります。私はスイングプログラマーではないので、便利な例はありませんが、解決策は invokeLater() を呼び出すことです

EventQueue invokeLater(new Runnable() {
    @Override
    public void run() {
        ...code that you want to run "later"...
    }
});

これにより、新しいイベントがイベント キューに投稿され、イベント スレッドがそのイベントをキューから取り出すと、指定した run() メソッドが実行されます。

于 2014-05-09T14:19:07.190 に答える