1

私は hawtdispatch を初めて使用するので、サンプル プログラムを実行してスレッドプールのデモを行いたいと考えています。以下は私が実行しようとしているプログラムです:

パブリック クラス DispatchQueueT {

public static void main(String[] args) {

    DispatchQueue queue = createQueue("Your queue");

    queue.execute(new Runnable()
        {
            public void run()
            {
                for (int i = 0; i < 100000; i++)
                {
                    System.out.println("First Task"+ "time  "+new Date()+" count : "+i);
                }
            }
        });

}

}

しかし、問題は、コンソールに100000回印刷する代わりに、ランダムに700回または800回しか印刷せず、プログラムが停止することです.. HawtDispatchを使用してこの単純なスレッドプールを実現する方法がわかりません.. :(

また、いくつかの質問の答えを知る必要があります

hawtdispatch を使用する場合、特定の時間にシステムで使用されているスレッドの数を知る方法はありますか? ディスパッチ キューのメモリ管理はどのように行われますか?

助けてください !!

Thx ...リチャ!!

4

1 に答える 1

4

この hawtdipatch ライブラリはわかりませんが、これはデーモンと通常のスレッドの典型的な問題のようです。

Java 仕様によると、JVM はすべての非デーモン スレッドが終了すると終了します。main() メソッドを実行するスレッドは非デーモン スレッドであり、コマンド ライン アプリケーションでは実行中の唯一の非デーモン スレッドでもあります。DispatchQueue は、アプリケーションを存続させないデーモン スレッドを生成している可能性が最も高いです。

その結果、JVM は「queue.execute()」呼び出しを実行した直後に終了します。JVM が完全に停止するまで、DispatchQueue 内のスレッドがいくつかのループを実行する時間があった可能性がありますが、JVM がすべてのスレッドを停止する前に 100,000 個すべてを完了する時間がありません。

HawtDispatcher のソース コードをいじってみると、これが実際に問題であることがわかりました。それは SimplePool.createWorker() にあります

private SimpleThread createWorker(int index) {
    SimpleThread w;
    try {
        w = new SimpleThread(this);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    w.setDaemon(true); // <- That's the one that causes trouble for you
    w.setPriority(priority);
    w.setName(name + "-" + (index+1));
    return w;
}

また、HawtDispatch では独自の WorkerPool 実装を簡単に置き換えることができないため、この動作を簡単に変更することはできないようです。

問題を解決するには、タスクの実行が完了するまで待つ必要があります。これは、次の 2 つの方法で実行できます。

1)。queue.execute() の後に Thread.sleep() 呼び出しを追加します。これは単純ですが、少し見苦しくもろいものです。

2).CountDownLatch などの適切な同期ツールを使用して、タスクの終了を適切に待ちます。

public static void main(String[] args) throws InterruptedException {
    DispatchQueue queue = createQueue("Your queue");
    final CountDownLatch latch = new CountDownLatch(1);
    queue.execute(new Runnable(){
            public void run(){
                for (int i = 0; i < 100000; i++){
                    System.out.println("First Task"+ "time  "+new Date()+" count : "+i);
                }
                latch.countDown();
            }
        });
    latch.await();
}
于 2012-08-14T09:42:16.957 に答える