为啥线程在单核 CPU 上工作?
Posted
技术标签:
【中文标题】为啥线程在单核 CPU 上工作?【英文标题】:Why is threading works on a single core CPU?为什么线程在单核 CPU 上工作? 【发布时间】:2013-05-11 13:59:32 【问题描述】:为了更好地理解 Java 中的线程,我编写了以下代码
public class SimpleRunnableTest
public static void main(String[] args) throws InterruptedException
long start = System.currentTimeMillis();
Thread t1 = new Thread(new TT1());
t1.start();
Thread t2 = new Thread(new TT2());
t2.start();
t2.join();
t1.join();
long end = System.currentTimeMillis();
System.out.println("end-start="+(end-start));
class TT1 implements Runnable
public void run()
try
Thread.sleep(5000);
catch (InterruptedException e)
e.printStackTrace();
class TT2 implements Runnable
public void run()
try
Thread.sleep(1000);
catch (InterruptedException e)
e.printStackTrace();
这个想法是,如果我在main
线程中顺序运行Thread.sleep(5000)
和Thread.sleep(1000)
,所消耗的时间将是6 sec
,但由于我使用的是线程,所以在多核 CPU 上它只会花费5 sec
机器,它做到了。但我的问题是:
为什么单核CPU机器上的结果还是5 sec
?当然使用了Threading,但不就是时分复用模拟线程吗?
我对时分复用的理解是:假设Thread.sleep(5000)
是任务A,Thread.sleep(1000)
是任务B,我们可以把它拆成:A1、A2、A3; B1、B2
顺序就是:A1、A2、A3、B1、B2
时分复用线程就是:A1、B1、A2、B2、A3
如果是,为什么第一个需要 6 秒,而第二个只有 5 秒?
我是这里的基地吗?
【问题讨论】:
一个进入睡眠状态,发生线程上下文切换,然后另一个执行(也进入睡眠状态)。 线程实现取决于系统构建器,在一个系统上它是绿色的,在另一个系统上是紫色的。你更喜欢哪个? 【参考方案1】:通过调用 Thread.sleep(sleeptime),线程发出信号,表明它至少在 'sleeptime' 毫秒内不需要 CPU。
同时可以执行另一个线程。
【讨论】:
但他们真的睡不着at the same time
,对吧?在 CPU 级别上,same time
是由time division multiplexing
实现的,这意味着真正发生的情况是 A 休眠一段时间,然后 B,然后 A,然后 B... 因为时间间隔对于每个线程都会产生sleeping at the same time
的错觉,这不是首先在单核CPU 上实现多线程的方式吗?因为无论如何,一个 CPU 不能一次执行多个命令,对吧?
"sleep" 这里是“什么都不做”的同义词——两个线程应该防止什么并行不做?此外,当前具有流水线和预测功能的 CPU 设计可以并行执行很多操作,即使在单核上也是如此【参考方案2】:
结果是 5,而不是 6,因为两个线程可以同时休眠。通过调用 Thread.sleep()
进入睡眠状态让另一个线程运行,但剩余的睡眠间隔计时器继续为两个线程计时。
请注意,这仅适用于睡眠(使用几乎为零的 CPU),但不适用于做有用的工作:在这种情况下,单核非超线程 CPU 上的计时确实会增加。例如,如果一个线程需要进行 5 秒的数字运算,而另一个需要进行 1 秒的数字运算,则两个线程的总时间将是 6 秒。
【讨论】:
刚刚测试,你是对的。如果任务是实际任务而不是睡眠,线程不会影响single-core non-hyperthreaded CPU
上消耗的总时间,感谢您的帮助:)以上是关于为啥线程在单核 CPU 上工作?的主要内容,如果未能解决你的问题,请参考以下文章