我正在阅读线程池,发现线程创建被认为是一个昂贵的过程。这抵消了我的直觉,我决定对它进行测试:
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
}
long end = System.currentTimeMillis();
System.out.println(end - start + "ms");
}
这会在我的系统上打印696ms
。因此创建一个线程的时间接近0.69毫秒。为什么这被认为很慢?
修改
public class Test {
static int a = 1;
static long start;
static void setA() {
++a;
if(a>=1000) {
long end = System.currentTimeMillis();
System.out.println(end - start + "ms");
}
}
public static void main(String[] args) {
start = System.currentTimeMillis();
for (int i = 0; i <= 1000; ++i) {
new Thread(new Runnable() {
@Override
public void run() {
setA();
}
}).start();
}
}
}
这会打印729ms
。
答案 0 :(得分:3)
当人们谈论线程创建缓慢时,通常是相对于线程正在进行的工作量。
尝试对计算任务进行基准测试,例如将100
个数字加在一起,并比较创建线程所需的时间(一旦您准确测量它)。
答案 1 :(得分:0)
有几个因素导致这种情况变慢。首先,start方法调用本机方法,而本机调用总是很慢。然后,创建一个线程是一个内核函数(为它分配内存,将它添加到调度程序),因此程序必须等待实际创建的线程。
答案 2 :(得分:0)
每次在程序中创建线程时,虚拟机(VM)和操作系统都必须分配一堆数据结构,以跟踪这些线程之间的执行和上下文切换。例如,每个线程都有自己的堆栈,它的局部变量,线程局部变量等等。如果它是绿色线程,则VM将分配和管理这些数据结构。如果它是本机线程,操作系统将管理它们。在任何一种情况下,您最终都会分配系统资源来管理线程。这就是为什么创建一个线程需要一点时间并且创建大量线程可能会消耗大量的系统资源。