为什么线程池独立而不是并发地接受任务?

Ana*_*ria 1 java multithreading blockingqueue threadpool

我试图让线程池的基础知识非常强大。我了解到它在内部使用阻塞队列来“窃取”任务并将它们运行到池中的给定线程中。这意味着如果我有 10 个任务和 5 个线程,它只能同时运行 5 个任务,直到 1 个任务完全完成。

问题是:为什么不并发?为什么不只是对这 10 个任务进行时间切片?这个实现的原因是什么?

Sol*_*low 5

为什么不能同时进行?为什么不只是对这 10 个任务进行时间切片?

您可以拥有一个能够执行十个并发任务的线程池。你只需要配置它至少有十个工作线程。“时间切片”任务是线程所做的。线程池的作用是:

  • 允许您的程序控制用于执行“后台”任务的线程数,以及
  • 允许您的程序重用线程,这比为每个新任务创建一个新线程,然后在任务完成时销毁该线程要高效得多。

  • @AnaMaria,我认为你应该尝试将线程_池_与_线程_分开来理解。最简单的线程池只是任务的阻塞队列和相同工作线程的集合。每个工作线程都会永远循环,等待从队列中获取任务,执行该任务,然后返回等待另一个任务。更复杂的线程池做同样的事情,但也提供了取消任务、关闭池、在需求低时杀死工作线程、在需求高时创建新线程等的方法。底层线程机制不知道或不知道关心池正在使用它。 (2认同)
  • ...仅谈论_线程_(池线程的处理方式与任何其他线程没有区别),“时间切片”意味着当“准备运行”的线程数量大于可用于运行它们的 CPU 数量时,那么操作系统_scheduler_将定期挂起一个已用完CPU轮次的线程,并让另一个线程获得CPU轮次。“轮次”可以是从千分之一秒到十分之一秒之间的任何时间,可能取决于系统管理员的突发奇想。 (2认同)