2014-11-08 32 views
1

我的应用程序应该具有“实时暂停”功能。用户可以暂停执行,做一些修改将要发生的事情,然后解除暂停并让事情发生。东西按用户指定的时间间隔发生,速度可以很慢,可以很快。线程是否有助于提高Java的效率?

我在这里使用线程的目标是提高多核系统的性能。应用程序应该在时间间隔内紧缩的数据量应该是任意大的(我期望在集合上有很多和很多的循环,修改对象属性和生成随机数,但是珍贵的小磁盘访问)。我不希望应用程序受到单个内核容量的限制,如果它可以使用更多的内存来加快运行速度。

这实际上是这样工作吗?我已经运行了一些测试(在程序活动期间对程序进行了大量计算,并查看了CPU的使用情况),但这并不是确凿的结果 - 在我的双核心机器上,使用率肯定接近100%但几乎没有100%。单线程(仅主要)Java应用程序是否使用所有可用的核心进行计算?

+0

“我在这里使用线程的目标是提高多核系统的性能。” < - 嗯,这可能会提高性能,是的,但是在并行处理时对性能更好的影响最大的因素是处理数据的算法 – fge 2014-11-08 09:11:32

+0

当然,单线程应用程序并不使用所有内核。 – kraskevich 2014-11-08 09:13:47

回答

2

单线程(仅主要)Java应用程序是否使用所有可用的核心进行计算?

不,它通常会使用单个内核。

让一个程序与多个线程并行执行计算可能会使其运行速度更快,但它对于任何类型的问题都不是一个神奇的解决方案。对于你的程序来说,这是否是一个合适的解决方案取决于你的程序在做什么,以及算法是否可以并行化。例如,如果您正在进行大量的计算,其中下一次计算取决于前一次计算的结果,那么使其成为多线程将无济于事,因为您无法同时进行计算 - 下一个首先必须等待前一个的答案。所以,你首先必须考虑你的程序中的哪些计算可以并行运行。

Java对多线程有很多支持。您可以直接使用线程编程,或使用executor service或使用fork/join framework。什么是合适的取决于你想要做什么。

+0

很好地解释了 – 2014-11-08 09:29:40

+0

好吧,所以假设我有一些需要以某种方式处理的元素集合,但是不需要访问同一集合中的其他元素,那么使用线程将会对此有所帮助?我需要点燃线程,然后等待所有线程完成。您提到的那种线程的哪种类型在这里最合适? – 2014-11-08 09:49:26

+0

如果您使用的是Java 8,那么平行流(Steve Siebert提到的)可能是最简单的,否则是执行器服务。如果您必须将所有计算的结果合并为一个最终结果,则fork/join将非常有用。 – Jesper 2014-11-08 10:36:10

1

一个java线程将运行在一个CPU上。要使用多个CPU,你应该有多个线程。

2

单线程(仅主要)Java应用程序是否使用所有可用的内核进行计算?

通常不会,但你可以利用一些Java中的较高级别的API,实际上是使用线程为你和你不会甚至直接usinfpg线程,多obviousiously叉/加入和执行者,不太明显的新的流API集合(即parallelStream)。

但是,一般来说,要利用所有内核,您需要进行某种并发。更进一步......真的很难只观察你的操作系统监视器来看看发生了什么(特别是只有2个内核)......你的操作系统还有其他的事情正在发生(试图管理自己,运行你的IDE,运行crontab,运行一个浏览器发布到stackoverflow;)。

最后,只是实现(并发)本身可能没有帮助,你必须为你的代码/算法“正确”。

1

想象一下,你必须用手执行各种任务。你会用一只手慢慢做,并且更有效地使用双手。同样,在Java或其他语言中,多线程为系统提供了许多手段。好消息是你可以有很多线程来完成不同的任务。在单个线程中运行操作会使程序不稳定,有时甚至无法响应。一个好的做法是在一个单独的线程中执行长时间运行的任务。例如,从一个数据库加载大块数据应该在一个单独的线程中处理。从互联网上下载数据也应该在一个单独的线程中处理。如果您在主线程中执行长时间运行操作,会发生什么情况?程序HANGS,并将变得没有响应,直到任务完成,用户会认为有些错误。我希望你得到它