1

スレッド化を始めたばかりです。100 個のスレッドをセットアップして開始し、5 秒間待ってから中断するメイン クラスを作成しました (少なくとも、それが実行されたと思います)。

public static void main(String[] args) {

    List<Thread> threads = new ArrayList<Thread>();

    for (int i = 0; i < 100; i++) {
        Thread t = new Thread(new Walker());
        threads.add(t);
    }

    System.out.println("Starting threads...");

    for (Thread thread : threads) {
        thread.start();
    }

    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // don't do anything
    }

    System.out.println("Time's up - Terminating threads...");
    for (Thread t : threads) {
        t.interrupt();
        System.out.print(".");
    }
    for (Thread t : threads) {
        try {
            t.join(10);
        } catch (InterruptedException e) {
            // don't do anything
        }
    }
    System.out.println("");
    System.out.println("All done.");
}

スレッドは次のように見えました。

public class Walker implements Runnable {
    public void run() {
        for (int i = 0;; i++) {
            //do some complicated stuff that takes some time
            System.out.println(Thread.currentThread().getName() + ":" + i);
            if (Thread.interrupted()) {
                break;
            }
        }
    }
}

さて、私が得た出力は、メインスレッドがスレッドに割り込み始めたということでしたが、一部のサブスレッドは終了する前に数回実行し続けました (つまり、ループの繰り返し)。

スレッドを開始しています...
スレッド-1:0
スレッド-2:0
スレッド-1:1
スレッド-3:0
[...]
時間切れ - スレッドを終了しています...
......スレッド-1:60
スレッド-1:61
...スレッド-1:62
スレッド-2:55
..すべて完了。
[スレッドからの出力がここでも続くことがある - join() の後]

当時、私は単一のスレッドに数回実行するのに十分なプロセッサ時間を割り当てることができることを完全には理解していませんでした。

しかし、メインスレッドがスレッドを終了する (つまり、中断する) 機会が得られる前に、スレッドがある程度の (長い) 時間実行されてもまったく問題ないことがわかりましたが、まだ疑問に思っています:すべてを中断する簡単な方法はありますか?メインスレッドから子スレッドをタイムリーに実行しますか? (スレッドのコンストラクターを介して「存続時間」を設定し、それを Walker クラス内でテストすることは、私が望むものではありません。)

また、すべてのスレッドが join() された後、最後の print ステートメントを実行して、個々のスレッドからの出力を確認することは可能ですか? (たぶん、別の場所で不具合が発生している可能性があります。実際のコードはもう少し複雑です...)

4

3 に答える 3

0
Maybe I have a glitch somewhere else; the actual code is a bit more complex...

はい、それはグリッチです。残念ながら、Java 側の単純なセット 1 プロパティではありません。

コードが商業的で複雑な場合は、主要な Os タイプのネイティブ ライブラリを作成するためにもう少し時間を割くことができます。その助けを借りて、必要に応じてスレッドを簡単に操作できます。

最初は、いくつかのパラメーターを使用して関数を呼び出すだけでなく、スレッドがネイティブの OS 側でどのように動作しているかを開発および理解するためのオーバーヘッドがあります:)

よくわかりませんが、問題がある場合は、グリッチが存在します。

于 2013-06-04T12:22:03.007 に答える