6

SwingWorkerバックグラウンドでサーバーと通信し、更新する がありますJFrameSwingWorkerアプリをデバッグしていて、作業が終了した後でもスレッドが残っていることに気付きました。Unsafe.park(java.lang.Object)ネイティブメソッドでぶら下がっています。これをさらに調べたところSwingWorker、アプリ内の他のすべての が終了後に同じことを行うことがわかりました。誰かが望むならソースコードを提供できますが、問題は非常に一般的であるように思われるため、必要ではないと思います。

アップデート

デバッガーなしでアプリを実行しましたが、問題はまだ発生しています。これはSwingWorkerスレッドのダンプです:

"SwingWorker-pool-2-thread-1" daemon prio=6 tid=0x03219800 nid=0xd74 waiting on
condition [0x04b7f000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x22ec63d8> (a java.util.concurrent.locks.Abstra
ctQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject
.await(Unknown Source)
        at java.util.concurrent.LinkedBlockingQueue.take(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

SwingWorkerアプリケーションで通常使用される方法を使用するサンプル プログラムを作成しました。このプログラムにも同じ問題があります。コードは次のとおりです。

package swingworkerlocktest;

import java.util.List;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;

public class SwingWorkerLockTest {

    public static void main(String[] args) {
        final JFrame frame = new JFrame("Frame");
        final JTextArea outputArea = new JTextArea(4, 20);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(outputArea);
        frame.pack();
        frame.setVisible(true);
        (new SwingWorker<Object, String>() {
            @Override
            protected Object doInBackground() throws Exception {
                publish("Background task.");
                return null;
            }

            @Override
            protected void process(List<String> chunks) {
                for (String str : chunks) {
                    outputArea.append(str + "\n");
                }
            }

            @Override
            protected void done() {
                outputArea.append("Background task finished.");
            }
        }).execute();
    }
}
4

1 に答える 1

2

これは SwingWorker の通常の動作です。スレッドがアイドル状態の場合、スレッドは 10 分後に終了するはずです。ここで説明されています

于 2016-04-05T14:10:05.587 に答える