Pun*_*cky 6 java multithreading
我正在阅读Java教程,其中提到在具有单个处理器的机器中不会发生实际的多线程.它提到操作系统为Java进程分配指定的时间,JVM线程调度程序选择一次运行一个线程的线程,持续时间很短.
我有一台四核处理器的笔记本电脑 - 通过在每个核心运行一个线程,可以以编程方式更快地运行多线程程序吗?我问这个问题的原因是因为书中提到只有真正的多处理器系统才能同时做多件事.
即使是单个CPU也可以在宽松的意义上同时执行"多个事物",但它们并非真正并行.您可以启动100个线程在单个核心上运行,并且它们将获得时间片,在此期间每个线程可以运行一些指令,从而产生它们全部同时执行的印象.
正如我在另一篇SO帖子中所说:双核机器上的多线程?
术语线程通常包含三个抽象层:
Java线程是用户线程.CPU中的4个内核计为硬件线程.由于跨层的映射是N:M,您可以看到可以将多个用户线程映射到较少数量的硬件线程.
现在,说了这个,通常有两类线程活动,每个都有自己的怪癖:
上面的第二类线程让您可以在四核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");
}
}
Run Code Online (Sandbox Code Playgroud)
total如果运行速度过快,请随意调整其值.现在我正在使用英特尔凌动的上网本,所以它不是很快.