如何决定是使用newCachedThreadPool还是newFixedThreadPool?

时间:2013-02-25 01:55:38

标签: java multithreading executorservice

我正在开发一个项目,我需要确保每个线程都在特定范围内工作。例如:

NO_OF_THREADS: 2
NO_OF_TASKS: 10

如果number of threads is 2number of tasks is 10,则每个帖子都会执行10 tasks。这意味着2个线程将执行20 tasks

在实际情况中,这些数字(任务数和线程数)将非常高,因为它们都可以在我的代码中配置。

在上面的示例中,first thread应该使用1 and 10second thread之间的ID应该使用11 and 20之间的ID,如果有更多线程则使用。之后,每个线程将建立数据库连接,然后插入数据库。

所以我的下面的代码工作正常。

public static void main(String[] args) {

    final int noOfThreads = 2;
    final int noOfTasks = 10;

    //create thread pool with given size 
    ExecutorService service = Executors.newFixedThreadPool(noOfThreads);

    // queue some tasks 
    for (int i = 0, int nextId = 1; i < noOfThreads; i++, nextId += noOfTasks) {
        service.submit(new ThreadTask(nextId, noOfTasks));
    }
}

class ThreadTask implements Runnable {
    private final int id;
    private int noOfTasks;

    public ThreadTask(int nextId, int noOfTasks) {
        this.id = nextId;
        this.noOfTasks = noOfTasks;
    }

    public void run() {

    //make a database connection

        for (int i = id; i < id + noOfTasks; i++) {

        //insert into database
        }
    }
}

我的问题: -

我正在浏览互联网上的各种文章,我读到了newCachedThreadPool。所以现在我想知道 - 我应该在我的代码中使用newFixedThreadPool还是newCachedThreadPool?目前我正在使用nexFixedThreadPool。我无法确定应选择newCachedThreadPoolnewFixedThreadPool的因素。所以这就是我发布我的场景的原因,我将对我的代码做些什么。

任何人都可以帮助我在这里选择什么?请详细解释我为什么我们选择哪些因素以便我能够理解这一点。我已经阅读了java文档,但无法决定我应该在这里选择什么。

感谢您的帮助。

2 个答案:

答案 0 :(得分:24)

  

所以现在我想知道 - 我应该在我的代码中使用newFixedThreadPool或newCachedThreadPool吗?

引用Javadocs,newFixedThreadPool()

  

创建一个重用固定数量的线程的线程池......

这意味着如果你要求2个线程,它将启动2个线程并且永远不会启动3.另一方面,newCachedThreadPool()

  

创建一个根据需要创建新线程的线程池,但在它们可用时将重用以前构造的线程。

在您的情况下,如果您只有2个线程可以运行,那么任何一个都可以正常工作,因为您只会向池中提交2个作业。但是,如果您想一次提交所有20个作业,但一次只能运行2个作业,则应使用newFixedThreadPool(2)。如果您使用了缓存池,那么20个作业中的每个将启动一个同时运行的线程,这可能不是最佳的,具体取决于您拥有多少CPU。

通常我在需要时立即生成线程时使用newCachedThreadPool(),即使当前正在运行的所有线程都忙。我最近在产生计时器任务时使用它。并发作业的数量并不重要,因为我从来没有产生很多,但我希望它们在被请求时运行,我希望它们能够重新使用休眠线程。

当我想限制在任何一点运行的并发任务数量时,我使用newFixedThreadPool()来最大限度地提高性能并且不会淹没我的服务器。例如,如果我从一个文件处理100k行,一次一行,我不希望每一行开始一个新线程,但我想要一定程度的并发,所以我分配(例如)10个固定线程到运行任务直到池耗尽。

答案 1 :(得分:0)

我觉得这高度依赖于工作类型, 如果您有一个 I/O 绑定的函数,请使用 newCachedThreadPool() 如果是没有 I/O 的 CPU 密集型操作,请使用另一个。

相关问题