1

非常に遅いデータ インポート コンソール アプリに直面しており、マルチスレッド化して高速化しようとしています。

コンソール アプリで X 個のワーカー スレッドを開始および管理するためのサンプル パターンはありますか? 理想的には、次のようなものがあることを望んでいました。

ThreadManager tm = new ThreadManager(maxthreads=10);
while (moreWork = true) {
    tm.addThread(new Thread(new MyClass));
}

ThreadManager は、最大数に達するまでスレッドを追加し、スロットが新しいスレッドで使用可能になるまで辛抱強く待ちます。

そのようなものはありますか?この問題に直面したのは私が初めてではありません。

4

2 に答える 2

3

@jeshurunの答えは正しいですが、後世のために、さらに情報を追加すると思いました。ExecutorService優れたコードを利用すると、コードは次のようになります。

ExecutorService threadPool = Executors.newFixedThreadPool(10);
while (moreWork) {
    threadPool.submit(new MyClass);
}
// stop pool after you've submitted the last job, submitted jobs will still run
threadPool.shutdown();
// you can wait for the last job to finish if you'd like
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);

またはを実装MyClassする必要があります。の場合、スレッド プールは、使用可能なスレッドがあるときにメソッドを実行します。メソッドによって返されたを使用して、メソッドによって返された値を取得できることを除いて、と同じです。によってスローされた例外を取得することもできます。ここにまともなチュートリアルがあります。RunnableCallableRunnableMyClass.run()CallableFuture<?>submit()MyClass.call()call()

于 2012-05-20T14:46:31.990 に答える
2

Java 5 以降を使用している場合はExecutorService、java.util.concurrent フレームワークのインターフェースとThreadPoolExecutor、固定数のスレッドを管理するためのその実装を使用してみませんか? 通常、Executorsクラス内の静的メソッドの 1 つを使用して、固定サイズの ThreadPool のインスタンスを取得し、必要な数のスレッドを送信して実行します。

ThreadPoolExecutorおよび java.util.concurrent パッケージ内のすべての関連文書は、ここから入手できます。

于 2012-05-20T05:15:02.220 に答える