一个双核处理器可以创建多少个java线程

一个双核处理器可以创建多少个java线程,java,multithreading,Java,Multithreading,所以机顶盒是双核的。 我想我们只能创建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);

所以机顶盒是双核的。 我想我们只能创建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多个线程,box也没有任何问题

是因为JVM意识到run块是空的并且优化了代码吗? 或者JVM实现的while(true)是不同的


注意:我也尝试过放置Thread.sleep(1000),但没有问题

即使在单核机器上也可以运行20个线程。 发生的事情称为时间切片

这是处理器模拟多个处理器的一种方式
一次执行多个任务的处理器。

线程不与物理或逻辑处理器内核绑定。操作系统在一个名为scheduler的部分中管理线程。基本上,每个线程都有一定的时间在处理器内核上运行,然后暂停,下一个线程有时间运行,一段时间后第一个线程又有时间运行。

可能的线程数与CPU内核无关。它是可用内存的一个功能。每个线程都需要一个单独的堆栈,因此根据堆栈大小,数量是有限的

例如,尝试:

java -Xss8m -Xmx64m .....

您可能会注意到,您不能创建那么多线程。

简短回答:您可以继续创建用户线程,直到JVM/OS无法处理更多线程为止

长答案:引用我给的另一个答案:

术语线程通常包括三个抽象层:

  • 用户线程是应用程序启动的线程,映射为N:M 致:
  • 内核线程,由操作系统管理的线程,映射N:M到:
  • 硬件线程,它们是实际可用的物理资源
您在应用程序中创建的是用户线程。如您所见,许多用户线程可以映射到较少数量的硬件线程(硬件可以处理的并发线程的实际数量,在本例中为2)


存在于用户线程和较低级别之间的多个层应用它们自己的调度机制在硬件核心上移动线程,以实现公平性、负载平衡或优先级。

while(true)呢?while(true)不应该完全阻塞线程吗;您正在调用sleep()。尝试删除对睡眠的调用,然后您将看到不间断无限循环的真正影响。我的第一次尝试显然是没有睡眠。我的理解是,sleep将保持线程Java doc says sleep导致当前执行的线程在指定的毫秒数内休眠(暂时停止执行),这取决于系统计时器和调度器的精度和准确性。线程不会失去任何监视器的所有权。调用sleep是另一回事:您当前正在执行的线程对处理器说:“现在我将睡眠,可能会找到并执行其他线程,或者做您必须做的事情,因为我现在只需睡眠一段时间;顺便说一句,至少在N毫秒内不要再回到我身边。”。您可以这样想。@JerilKuruvila数百个线程状态对象不是问题。它们并不庞大,“处理”它们主要是在队列和其他容器上围绕指向它们的指针移动。试试看——创建500个休眠线程,你会发现它对你的机器性能没有明显的影响。嗨,都铎,如果我把所有代码放在一个while(true)循环中会发生什么。根据你的解释,这不会有任何区别,对吧?@Jeril Kuruvila:只要你有足够的RAM来生成线程,并且调度程序不会阻塞太多线程,这不会有任何区别。20个线程应该不是问题。所以你的答案有问题。Box正在运行并正在创建线程,但它不响应键。早期没有顶层while(true),它运行良好。你能解释一下这种行为吗?注意:现在创建了数千个线程。我的这一评论并不是要反驳你的宝贵答案。@Jeril Kuruvila:数千个线程可能会造成影响,因为每个线程都需要调度,并且占用一定的堆栈空间。调度程序忙于管理线程,导致系统无法响应。这是意料之中的行为。这看起来需要一段时间才能理解,但谢谢你对我的支持@Tudor,@peter.petrov。