1

私は、何年も触れていない古い Java コードを更新中です。私の質問は、現在スレッドプールを行うための最良の方法は何ですか?

以前は、同時実行ユーティリティ クラスを使用していました。

import EDU.oswego.cs.dl.util.concurrent.BoundedBuffer;
import EDU.oswego.cs.dl.util.concurrent.PooledExecutor;

ただし、Java 7 に更新している今、それが最善の方法だとは思いません。

ここに私のコードスニペットがあります:

Static PooledExecuter pooledExecuter = null;

....

private ThreadPoolExample(Int initialCapactiy, int initThreadPoolSize,
                   int maxThreadPoolSize, int minThreadPoolSize, 
                   int time) throws Exception 
{
  pooledExecuter = new PooledExecuter(new BoundedBuffer(initialCapactiy),     maxThreadPoolSize);
pooledExecuter.setMinimumPoolSize(minThreadPoolSize);
pooledExecuter.setKeepAliveTime(1000 * time);
pooledExecuter.waitWhenBlocked();
pooledExecuter.createThreads(initThreadPoolSize)

    //setup thread
 this.thread = new Thread(this);
 this.thread.setName("threadtest");
   try 
{
   this.thread.setDaemon(this)
} 
catch (Exception e)
{
}
}

run メソッドでは、pooledExecuter.execute(new TestClass) も呼び出します。

基本的に、スレッドプールを今どのようにすべきか知りたいですか?

どんな助けでも大歓迎です。

4

4 に答える 4

2

がどのように機能するのか正確にはわかりませんが、次のBoundedBufferように言う必要があると思います:

threadPool = Executors.newFixedThreadPool(maxThreadPoolSize, new ThreadFactory() {
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        thread.setDaemon(true);
        return thread;
    }
});

は、を使用して内部的に作成さBoundedBufferれる に置き換えることができます。BlockingQueueLinkedBlockingQueue

キープアライブ設定 (など) をより細かく制御したい場合は、ThreadPoolExecutorコンストラクターを直接呼び出すことができます。

public ThreadPoolExecutor(int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory)

何かのようなもの:

threadPool = new ThreadPoolExecutor(initialCapactiy, maxThreadPoolSize,
    time, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(),
    new ThreadFactory() {
        public Thread newThread(Runnable r) {
            Thread thread = new Thread(r);
            thread.setDaemon(true);
            return thread;
        }
    });
于 2013-03-18T17:43:59.960 に答える
1

アイテムを挿入するためのバインドされたキューを指定するメソッドなど、ExecutorServiceの多数の便利なメソッドの 1 つから構築できる を使用する必要があります。Executors

たとえば、Staticキーワード (大文字の S) が無効で、PooledExecutorスペルが異なっています。それがコンパイルされると確信していますか?

于 2013-03-18T17:44:27.183 に答える
1

Java Concurrency Utils を使用できます。スレッドプールを操作する Executor フレームワークを見てください。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executor.html http://www.vogella.com/articles/JavaConcurrency/article.html#threadpools

または、Spring を使用している場合は、TaskExecutor を見てください。

http://static.springsource.org/spring/docs/3.0.x/reference/scheduling.html

コードを Java EE アプリケーション サーバー内で実行している場合は、サーバーのドキュメントを参照して、スレッド プールを使用する最適な方法を見つける必要があります。

于 2013-03-18T17:45:19.710 に答える
-1

Java 7 で ForkJoinPool が導入されました。いつ使用するかについての記事はこちら

于 2013-03-18T17:48:01.407 に答える