所以STB是双核心。 我以为我们只能创建2个合适的线程。
在每个keyreleased()
中我正在创建一个新线程
Runnable runnable = new Runnable()
{
int i = j;
public void run()
{
while (true)
{
System.out.println("This thread is running always number is " + i);
}
}
};
Thread th = new Thread(runnable);
th.setPriority(Thread.MAX_PRIORITY);
th.start();
j++;
//...
}
但即使创建了20多个主题后,框也没有任何问题。
是不是因为JVM意识到运行块是空的并且它优化了代码? 或者while(true)的JVM实现是否不同?
注意:我也尝试过使用Thread.sleep(1000),但没有问题
答案 0 :(得分:6)
即使在单核计算机上也可以运行20个线程。 发生的事情称为时间切片。
http://en.wikipedia.org/wiki/Time_slice#Time_slice
这是处理器模拟多个的一种方式 处理器一次执行多个任务。
答案 1 :(得分:3)
可能的线程数与CPU内核无关。它相当于可用内存的功能。每个线程都需要一个单独的堆栈,因此根据堆栈大小,数量是有限的。
例如,尝试:
java -Xss8m -Xmx64m .....
您可能会注意到您无法创建那么多线程。
答案 2 :(得分:2)
简短回答:您可以继续创建用户线程,直到您的JVM / OS无法再处理为止。
答案很长:引用我给this question的另一个答案:
术语线程通常包含三个抽象层:
您在应用程序中创建的是用户线程。如您所见,许多用户线程可以映射到较少数量的硬件线程(硬件可以处理的实际并发线程数,在本例中为2)。
用户线程和较低级别之间存在的多个层应用它们自己的调度机制来在线程上移动线程,以实现公平性,负载平衡或优先级。
答案 3 :(得分:1)
线程不依赖于物理或逻辑处理器核心。操作系统管理称为调度程序的部分中的线程。基本上每个线程都会在处理器核心上运行一段时间然后它会暂停并且下一个线程有时间运行,经过一段时间后第一个线程再次运行。