线程是否有助于提高Java的效率?

线程是否有助于提高Java的效率?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我的应用程序应该具有实时暂停功能。用户可以暂停执行,做一些修改将要发生的事情,然后取消暂停,让事情发生。事情按照用户指定的时间间隔发生,可以慢,也可以快 我在这里使用线程的目标是提高多核系统的性能。应用程序在时间间隔内处理的数据量应该是任意大的,我希望在集合上有很多循环,修改对象属性并生成随机数,但宝贵的磁盘访问很少。我不希望应用程序受到单个核心容量的限制,如果它可以使用更多的资源来运行得更快的话 这真的会这样吗 我已经运行了一些测试,对一个程序进行了大量的数据处理,并查看了其活动期间的CPU使

我的应用程序应该具有实时暂停功能。用户可以暂停执行,做一些修改将要发生的事情,然后取消暂停,让事情发生。事情按照用户指定的时间间隔发生,可以慢,也可以快


我在这里使用线程的目标是提高多核系统的性能。应用程序在时间间隔内处理的数据量应该是任意大的,我希望在集合上有很多循环,修改对象属性并生成随机数,但宝贵的磁盘访问很少。我不希望应用程序受到单个核心容量的限制,如果它可以使用更多的资源来运行得更快的话

这真的会这样吗


我已经运行了一些测试,对一个程序进行了大量的数据处理,并查看了其活动期间的CPU使用情况,但这并不是真正的结论——在我的双核机器上,使用率肯定接近100%,但几乎从来没有100%。单线程纯主Java应用程序是否使用所有可用内核进行计算?

Java线程将在单个cpu中运行。要使用多个cpu,您应该有多个线程。

一个java线程将在一个cpu中运行。要使用多个CPU,您应该有多个线程

单线程纯主Java应用程序是否使用所有可用内核进行计算

不,它通常使用单芯

让一个程序与多个线程并行计算可能会使它更快,但这并不是解决任何问题的神奇方法。这是否适合于您的程序,取决于您的程序正在做什么,以及算法是否可以并行化。例如,如果您正在进行大量计算,而下一次计算取决于上一次计算的结果,那么将其设置为多线程将不会有多大帮助,因为您不能同时进行计算-下一次计算首先必须等待上一次计算的结果。因此,您首先必须考虑程序中的哪些计算可以并行运行

Java非常支持多线程。您可以直接使用线程编程,或使用,或使用。什么是合适的取决于你到底想做什么

单线程纯主Java应用程序是否使用所有可用内核进行计算

不,它通常使用单芯

让一个程序与多个线程并行计算可能会使它更快,但这并不是解决任何问题的神奇方法。这是否适合于您的程序,取决于您的程序正在做什么,以及算法是否可以并行化。例如,如果您正在进行大量计算,而下一次计算取决于上一次计算的结果,那么将其设置为多线程将不会有多大帮助,因为您不能同时进行计算-下一次计算首先必须等待上一次计算的结果。因此,您首先必须考虑程序中的哪些计算可以并行运行

Java非常支持多线程。您可以直接使用线程编程,或使用,或使用。什么是合适的取决于你到底想做什么

单线程纯主Java应用程序是否使用所有可用内核进行计算

通常不会,但您可以使用java中的一些更高级API,这些API实际上为您使用线程,您甚至不直接使用NFPG线程,更明显的是fork/join和executors,而在集合(即parallelStream)上新的Streams API不太明显

不过,一般来说,要使用所有的核心,您需要进行某种并发。此外,很难只通过观察操作系统监视器来了解情况,尤其是只有两个内核的情况……操作系统还有其他事情要做,比如运行IDE、运行crontab、运行浏览器来发布stackoverflow

最后,仅仅实现并发本身可能没有帮助,您必须为您的代码/算法正确地执行它

单线程纯主Java应用程序是否使用所有可用内核进行计算

通常不会,但您可以使用java中的一些更高级API,这些API实际上为您使用线程,您甚至不直接使用NFPG线程,更明显的是fork/join和executors,而在集合(即parallelStream)上新的Streams API不太明显

不过,一般来说,要使用所有的核心,您需要进行某种并发。此外,很难只通过观察操作系统监视器来了解情况,尤其是只有两个内核的情况……操作系统还有其他事情要做,比如运行IDE、运行crontab、运行浏览器来发布stackoverflow

最后,只是实施
并发本身可能没有帮助,您必须为您的代码/算法正确地执行它

想象一下,你必须用手完成各种任务。你可以用一只手慢慢地做,用两只手更有效地做。类似地,在java或任何其他语言中,多线程为系统提供了许多人手。好消息是,您可以有许多线程来执行不同的任务。在单个线程中运行操作会使程序变得迟钝,有时甚至没有响应。一个好的实践是在单独的线程中执行长时间运行的任务。例如,从数据库加载大块数据应该在单独的线程中处理。从互联网下载数据也应该在单独的线程中处理。如果在主线程中执行长时间运行的操作,会发生什么情况?程序挂起并将变得无响应,直到任务完成,用户会认为有什么问题。我希望你得到它

想象一下你必须用手做各种各样的任务。你可以用一只手慢慢地做,用两只手更有效地做。类似地,在java或任何其他语言中,多线程为系统提供了许多人手。好消息是,您可以有许多线程来执行不同的任务。在单个线程中运行操作会使程序变得迟钝,有时甚至没有响应。一个好的实践是在单独的线程中执行长时间运行的任务。例如,从数据库加载大块数据应该在单独的线程中处理。从互联网下载数据也应该在单独的线程中处理。如果在主线程中执行长时间运行的操作,会发生什么情况?程序挂起并将变得无响应,直到任务完成,用户会认为有什么问题。我希望您能理解

我在这里使用线程的目标是提高多核系统的性能。当然,单线程应用程序并不使用所有内核。我在这里使用线程的目标是提高多核系统的性能。单线程应用程序当然不会使用所有的核心。好吧,所以假设我有一个元素集合,我需要以某种方式处理它,但它不需要访问同一集合的其他元素,那么在这里使用线程将很有帮助?我需要把这些线程放出来,然后等待它们全部完成。您提到的哪种类型的线程在这里最合适?如果您使用的是Java 8,那么Steve Siebert提到的并行流可能是最简单的,否则就是executor服务。如果您必须将所有计算的结果组合成一个单一的最终结果,那么fork/join将非常有用。我在考虑让线程有一个选择器属性,这会影响它们在集合上迭代的方式,比如线程N从N开始,每个nrofProcessor都是th,跳过集合的其他元素。好主意,坏主意?这是你可以采取的一种方法。例如,您还可以创建一个工作项队列(例如ArrayBlockingQueue),并拥有一个由ExecutorService管理的线程池,每个线程将从队列中选择要处理的项目。看看java.util.concurrent包中提供了什么。@AbuDhabi您似乎对多线程有些陌生。一个常见的陷阱是在线程中思考,而不是独立作业。我们应该关注算法以及如何将其并行化,也就是说,细分为数据区域、管道中的步骤或递归子任务。好吧,假设我有一个元素集合,我需要以某种方式进行处理,但不需要访问同一集合中的其他元素,那么在这里使用线程会有帮助吗?我需要把这些线程放出来,然后等待它们全部完成。您提到的哪种类型的线程在这里最合适?如果您使用的是Java 8,那么Steve Siebert提到的并行流可能是最简单的,否则就是executor服务。如果您必须将所有计算的结果组合成一个单一的最终结果,那么fork/join将非常有用。我在考虑让线程有一个选择器属性,这会影响它们在集合上迭代的方式,比如线程N从N开始,每个nrofProcessor都是th,跳过集合的其他元素。好主意,坏主意?这是你可以采取的一种方法。例如,您还可以创建一个工作项队列(例如ArrayBlockingQueue),并拥有一个由ExecutorService管理的线程池,每个线程将从队列中选择要处理的项目。看看java.util.concurrent包中提供了什么。@AbuDhabi您似乎对多线程有些陌生。一个常见的陷阱是在线程中思考,而不是独立作业。我们应该关注算法以及如何将其并行化,即细分为数据区域、管道中的步骤或递归子任务。