我正在开发一个项目,我需要确保每个线程都在特定范围内工作。例如:
NO_OF_THREADS: 2
NO_OF_TASKS: 10
如果number of threads is 2
和number of tasks is 10
,则每个帖子都会执行10 tasks
。这意味着2个线程将执行20 tasks
。
在实际情况中,这些数字(任务数和线程数)将非常高,因为它们都可以在我的代码中配置。
在上面的示例中,first thread
应该使用1 and 10
和second 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
。我无法确定应选择newCachedThreadPool
或newFixedThreadPool
的因素。所以这就是我发布我的场景的原因,我将对我的代码做些什么。
任何人都可以帮助我在这里选择什么?请详细解释我为什么我们选择哪些因素以便我能够理解这一点。我已经阅读了java文档,但无法决定我应该在这里选择什么。
感谢您的帮助。
答案 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 密集型操作,请使用另一个。