1

少し前に、Swing EDT デッドロックを検出して回復を試みるコードをアプリケーションに追加したので、ユーザーは少なくともファイルを保存できました (デッドロックが発生しないことが最善ですが...)。Java 1.6 では、これは簡単です。EDT が十分な時間ブロックされていることを検出し、バックグラウンド スレッドからこれを呼び出します。

EventQueue newQ = new EventQueue();
Toolkit.getDefaultToolkit().getSystemEventQueue().push(newQ);

新しい UI イベントは新しい EventQueue/EDT で処理され、ユーザーは作業を保存できます。

Java 8 では、(ブロックされた) EventDispatchThread を古いキューから新しいキューにコピーするように EventQueue.push の実装が変更されているため、これは機能しません。

4

3 に答える 3

0

もちろん、私はいつでも少し悪いことをすることができます:

private static void hackAroundJava8Protections(EventQueue newQ) {
    try {
        Field field = newQ.getClass().getDeclaredField("dispatchThread");
        field.setAccessible(true);
        field.set(newQ, null);
        Method method = newQ.getClass().getDeclaredMethod("initDispatchThread");
        method.setAccessible(true);
        method.invoke(newQ);
    } catch (Throwable e) {
        throw new RuntimeException(e);
    }
}

これにより、新しい EventDispatchThread が開始され、アプリケーション UI を使用できるようになります。自分がユーザーであるかのようにデータを保存できました。どのような欠点があるのか​​ わかりません。ブロックされた EDT を再開するための、それほど怖くない方法はないでしょうか?

于 2015-02-12T23:42:19.597 に答える