我的应用程序应该有一个"实时暂停"功能。用户可以暂停执行,做一些修改将要发生的事情,然后取消暂停并让事情发生。按照用户指定的定期间隔发生,可以很慢,可以很快。
我在这里使用线程的目标是提高多核系统的性能。应用程序应该按时间间隔处理的数据量应该是任意大的(我希望在集合上有很多很多循环,修改对象属性并生成随机数,但是宝贵的小磁盘访问)。我不希望应用程序受到单个核心容量的限制,如果它可以使用更多来运行更快。
这实际上会这样吗?
我已经进行了一些测试(使程序紧缩很多,并查看其活动期间的CPU使用情况),但它并不是真正的结论 - 使用率肯定接近100%我的双核机器,但几乎没有100%。单线程(仅限主要)Java应用程序是否使用所有可用内核进行计算?
答案 0 :(得分:2)
单线程(仅限主要)Java应用程序是否使用所有可用内核进行计算?
不,它通常会使用单核。
使程序与多个线程并行执行计算可能会使其更快,但对于任何类型的问题它都不是一个神奇的解决方案。这是否适合您的程序,取决于您的程序正在做什么,以及算法是否可以并行化。例如,如果您正在进行大量计算,其中下一次计算取决于先前计算的结果,那么使其成为多线程将无济于事,因为您无法同时进行计算 - 下一个必须先等待前一个答案。因此,您首先必须考虑程序中的哪些计算可以并行运行。
Java对多线程有很多支持。您可以直接使用线程进行编程,也可以使用executor service,或使用fork/join framework。什么是合适的取决于你想要做什么。
答案 1 :(得分:2)
单线程(仅限主要)Java应用程序是否使用所有可用内核进行计算?
通常不会,但你可以在java中使用一些更高级别的api,它实际上是为你使用线程,你甚至不直接使用usinfpg线程,更明显的是fork / join和executors,不太明显的是集合上的新Streams API(即parallelStream)。
但是,一般而言,要使用所有内核,您需要执行某种并发操作。更进一步......很难直观地观察OS监视器以查看发生了什么(特别是只有2个核心)...您的操作系统正在进行其他操作(尝试自我管理,运行IDE,运行crontab,运行一个发布到stackoverflow的浏览器;)。
最后,只是实现(并发)本身可能没有帮助,你必须这样做"对"为您的代码/算法。
答案 2 :(得分:1)
java线程将在单个cpu中运行。要使用多个CPU,您应该有多个线程。
答案 3 :(得分:1)
想象一下,你必须用手做各种任务。你会用一只手慢慢地做,而且用双手更有效率。类似地,在java或任何其他语言中,多线程为系统提供了许多方法。好消息是你可以有很多线程来完成不同的任务。在单个线程中运行操作将使程序变得迟缓并且有时无响应。一个好的做法是在一个单独的线程中执行长时间运行的任务。例如,应该在单独的线程中处理从数据库加载大块数据。从互联网下载数据也应该在一个单独的线程中处理。如果你在主线程中进行长时间运行会发生什么?程序HANGS将变得无响应,直到任务完成并且用户将认为存在某些错误。我希望你明白了