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)
{
}
}

在我的运行方法中,我还调用了 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可以被替换为使用BlockingQueue内部创建的LinkedBlockingQueue

如果您想对保持活动设置(等)进行更细粒度的控制,则可以直接调用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,您可以从 中的众多便捷方法之一构造它Executors,包括指定有界队列的方法等,用于插入项目。

我在您的代码中看到许多拼写错误,例如Static关键字(大写 S)无效并且PooledExecutor拼写不同。你确定编译?

于 2013-03-18T17:44:27.183 回答
1

您可以使用 Java 并发实用程序。查看用于处理线程池的 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 回答