我正在阅读
Java教程,其中提到在具有单个处理器的机器中不会发生实际的多线程.它提到操作系统为Java进程分配指定的时间,JVM线程调度程序选择一次运行一个线程的线程,持续时间很短.
我有一台四核处理器的笔记本电脑 – 通过在每个核心运行一个线程,可以以编程方式更快地运行多线程程序吗?我问这个问题的原因是因为书中提到只有真正的多处理器系统才能同时做多件事.
解决方法
即使是单个cpu也可以在宽松的意义上同时执行“多个事物”,但它们并非真正并行.您可以启动100个线程在单个核心上运行,并且它们将获得时间片,在此期间每个线程可以运行一些指令,从而产生它们全部同时执行的印象.
正如我在另一篇SO帖子中所说:multithreading on dual core machine?
术语线程通常包含三个抽象层:
>用户线程是由应用程序启动的线程,并将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"); } }
如果运行速度过快,请随意调整总值.现在我正在使用英特尔凌动的上网本,所以它不是很快.