即使是单个CPU,也可以从松散的意义上“同时完成多项任务”,但是它们并不是真正并行的。您可以启动100个线程在单个内核上运行,它们将获得时间片,在每个时间片中它们可以运行一些指令,从而给人一种印象,即它们都在同一时间执行。
线程一词通常涵盖三个抽象层:
- 用户线程 是由应用程序启动的线程,并且被N:M映射到:
- 内核线程 (由操作系统管理的线程)将N:M映射到:
- 硬件线程 ,这是可用的实际物理资源。
Java线程是用户线程。CPU中的4个核心被视为硬件线程。由于跨层的映射是N:M,因此可以看到可以将多个用户线程映射到较少数量的硬件线程。
话虽如此,通常有两类线程活动,每种都有自己的怪癖:
- I / O线程 :这些线程大部分时间都在等待从流进行的读/写操作,并且在此期间被阻塞(它们没有计划执行,直到发生事件将其唤醒)。CPU上有指示灯,即使在单个内核上,它们中的许多也可以同时运行。
- 计算线程 :这些线程进行大量的数字运算,并最大程度地使用CPU。通常启动的线程数多于(可用内核数的2倍)会降低性能,因为CPU的功能单元数量有限:ALU,FPU等。
上面的第二类线程使您真正看到了好处,或者在四核CPU上运行了多线程Java程序。这是一个简单的程序示例,该程序先按顺序执行1.000.000.000数字的平方,然后使用具有4个线程的线程池并行执行:
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;class ThreadTask implements Runnable { private int total = 0; public ThreadTask(int total) { this.total = total; } @Override public void run() { int value = 0; for(int i = 0; i < total; i++) { value = i * i; } } }public class Test { public static void main(String[] args) throws InterruptedException { int total = 1000000000; long start = System.currentTimeMillis(); long value = 0; for(int i = 0; i < total; i++) { value = i * i; } long stop = System.currentTimeMillis(); System.out.println((stop - start) + " ms"); ExecutorService exec = Executors.newFixedThreadPool(4); start = System.currentTimeMillis(); for(int i = 0; i < 4; i++) { exec.submit(new ThreadTask(total / 4)); } exec.shutdown(); exec.awaitTermination(10, TimeUnit.SECONDS); stop = System.currentTimeMillis(); System.out.println((stop - start) + " ms"); }}total如果运行速度太快,请随意调整其值。现在,我正在与Intel Atom一起从事上网本的开发,因此速度并不是很快。



