我正在开发一个小型多线程应用程序(在java中)以帮助我理解它。当我研究它时,我了解到理想的线程数量,你想要处理器支持的数量(即英特尔i3中的4个,我认为英特尔i7中的8个)。但单独摆动已经有3个线程+ 1个线程(在这种情况下是主线程)。这是否意味着我不会在支持4个线程的处理器上有任何重大改进? swing线程是否会消耗所有处理器线程,而其他所有线程都只能在同一个处理器上运行?即使使用那些摆动线程,它是否能够多线程(性能方面)?
OBS:需要做的一个重要观察是我将使用JFrame并进行主动渲染。这可能就我将随波逐流而言。
答案 0 :(得分:3)
大多数线程做的第一件事就是等待。他们就在那里,所以他们准备好在系统需要他们服务的那一刻就去。
关于理想线程数的评论是针对100%工作负载的线程数。
答案 1 :(得分:3)
我了解了理想的线程数量,您希望处理器支持的数量
只有当Thread
占用整个CPU时,该声明才有效。例如,Swing线程(Event Dispatch Thread)大部分时间都在等待用户输入。
答案 2 :(得分:3)
Swing的线程花了很多时间闲着。理想的线程数是在100%处理器时间或接近100%处理器时间执行的线程。 由于其他因素,您可能仍然没有看到显着的改进,但是摆动中固有的线程不应该成为一个问题。
答案 3 :(得分:2)
是的,他们这样做只是极少。还有其他线程,如GC和终结器线程,它们在后台运行。这些都是JVM运行所必需的,就像Swing工作所需的Swing线程一样。
除非你的资源或CPU容量很小,否则你不必担心它们。
对于现代系统,其中许多系统具有多个处理器和/或多个内核,JVM和操作系统将在其他处理器上运行这些其他线程,并仍然为您的用户提供所需的所有处理器能力。
此外,大多数后台Swing线程都在等待循环中等待处理事件并进行显示更改。除非你做错了什么,否则它们应该构成你应用程序处理器的少量要求。
我了解了理想的线程数量,您希望处理器支持的数量
正如@Robin所提到的,只有在尝试优化具有许多CPU绑定操作的程序时才需要这样做。例如,我们的应用程序通常有1000个线程但有8个处理器,并且仍然非常敏感,因为线程都在等待IO或事件。您需要担心CPU数量的唯一时间是在进行处理器密集型操作时,并且您正在尝试最大化吞吐量。
答案 4 :(得分:2)
理想的线程数不一定取决于你拥有的cpu(核心数)。根据您正在执行的实际代码,需要进行大量调整。
例如,让我们来一个执行一些数据库查询的Runnable(无关紧要)。大部分线程时间将被用于等待数据库的响应。所以如果你有4个核心,并执行4个线程。可能性是,在任何给定时间,其中许多都被db调用阻止。您可以轻松地生成更多线程,对您的CPU没有任何不良影响。在这种情况下,您不受机器规格的限制,而是受数据库处理的并发程度的限制。
另一个例子是文件I / O,它花费大部分时间等待I / O子系统响应数据。
唯一真正的方法是评估您的多线程代码,以及给定环境的试错。