1

次のようなコードがあります。

public void testThreads() throws Exception {
   MyThreadManager mgr = createAndStartMyManager();
   Thread t1 = createMyThread(mgr, 1);
   Thread t2 = createMyThread(mgr, 2);

   t1.start();
   t2.start();

   //do some checks

   t1.join();
   t2.join();
}

MyThreadManagerスレッドで動作し、いつでもそれらのいずれかを中断する可能性があります。これはテスト ケースの一部であり、実行中のスレッドをデバッグする必要があるためjoins、デバッグが終了するまでテストを待機させるように追加しました (テストが終了すると、JUnit はデバッガーを切断します)。

問題は、場合によっては結合がハングすることですjstack。出力は次のようになります。

    at java.lang.Object.wait(Native Method)
    - waiting on <0xeec68eb0> (a java.lang.Thread)
    at java.lang.Thread.join(Thread.java:1143)
    - locked <0xeec68eb0> (a java.lang.Thread)
    at java.lang.Thread.join(Thread.java:1196)
    at MyClass.testThreads(MyClass.java:100)

joinJDK(私は1.6.0_07を使用しています)の実装によると、スレッドは呼び出しと(ソースコードでマークされています)の間で終了するようisAliveですwait

public final synchronized void join(long millis)
throws InterruptedException {
    long base = System.currentTimeMillis();
    long now = 0;

    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (millis == 0) {
        while (isAlive()) {
            // -----> here ???? <------
            wait(0);
        }
    } else {
        while (isAlive()) {
            long delay = millis - now;
            if (delay <= 0) {
                break;
            }
            wait(delay);
            now = System.currentTimeMillis() - base;
        }
    }
}

ThreadPoolExecutor と FutureTask で同じことを試してみましたが、動作は同じでした (ハングしている)。

だから私の質問は、私が競合状態に真実であるかどうか、またハングすることなくスレッドを明確に結合する方法です...

ありがとう

4

1 に答える 1