如果我有一个固定大小的线程池,它何时会实际调用Thread.start()
来启动线程? (它会启动这些它被创建时,还是会等到我开始提交任务?)在线程池中创建实际的线程
回答
如果创建一个固定大小的线程池是这样的:
ExecutorService es = Executors.newFixedThreadPool(5);
没有线程最初创建。当您提交第一个任务时,只创建一个线程(它被命名为“pool-1-thread-1”)
对于每个额外提交的任务,创建一个新的线程直到指定的固定大小在这个例子中),即使任务没有真正并行运行
如果,例如,您只能提交3个任务,只有3个线程将具有以下名称创建: pool-1-thread-1 pool-1-thread-2 pool-1-thread-3
这种优化是重要的,因为创建一个新的线程是一个资源大量的操作。
任何使用LockSupport.Park
方法将当前未执行任务的线程置于等待模式。
当所有线程忙于执行任务时,其他提交的任务将放入阻塞队列,等待线程变为可用状态。
所以要回答你的问题,线程只在任务第一次提交时才开始运行。
该信息对于JDK 7是正确的。我没有检查过其他实现。
我认为这个答案会受益于一些参考或支持细节。 (该行为是否在某处指定?是否在所有JDK实现中都是如此?) – ruakh
@Gray:我不明白您的意见。您是否说过您查看了特定JDK实现的源代码并确认了vstrom编码器的解释准确地描述了该实现的行为?如果是这样,那么请考虑编辑答案以表明您已经确认它是正确的特定JDK实现(并指向相关代码的链接)。 – ruakh
是的,我有@ruakh。例如,任何sun开发工具包都有src.zip。可以从这里获得openjdk源代码:http://download.java.net/openjdk/jdk8/不幸的是,这些代码都不可链接。 – Gray
- 1. Java中实际停止()线程的线程池?
- 2. 如何创建线程池?
- 3. 何时创建线程池?
- 4. Node实际创建多少个线程?
- 5. 如何在Kotlin中创建线程池
- 6. 在c中创建线程池#
- 7. 如何在nodejs中创建线程池?
- 8. Python的线程/线程池的实现
- 9. 线程池中的线程
- 10. 使用System.Threading.Tasks.Parallel在线程池中创建新线程?
- 11. 线程池实现
- 12. 使用在线程池线程上创建的BitmapImage
- 13. .NET中创建线程池(C#)
- 14. 线程池的实现
- 15. 线程的实际用途
- 16. 多线程 - 新线程vs线程池
- 17. 使用Boost线程和io_service创建线程池
- 18. 通过线程池处理器相关性和线程创建
- 19. 线程池最大线程
- 20. pthread退出线程池中的线程
- 21. 线程池中的活动线程号
- 22. 线程池中的线程状态
- 23. 线程池中线程的可用性?
- 24. 终止线程池中的线程
- 25. 如何创建和线程池
- 26. hystrix如何创建其线程池
- 27. 在JAX-RS api中实现线程池
- 28. 在调用期间在WCF服务中创建后台线程,占用ASP .NET线程池中的线程?
- 29. 如何创建多个线程池(即多个执行程序,每个线程池都有一个线程)
- 30. Java:在服务器应用程序中创建线程池
你的问题对我来说不是很清楚。 – Sid
可能的重复[如何Threadpool重用线程和它如何工作](http://stackoverflow.com/questions/19765904/how-threadpool-re-use-threads-and-how-it-works) – Calculator