下面首先举两个例子来分别展示显式创建线程和使用线程池创建线程:
显式创建线程:
public class NewThreadDemo {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
结果如下:
Thread-0
Thread-3
Thread-2
Thread-4
Thread-6
Thread-8
Thread-1
Thread-7
Thread-5
Thread-9
使用线程池创建线程:
import cn.hutool.core.thread.NamedThreadFactory;
import java.util.concurrent.*;
public class ThreadPoolDemo {
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(11, 20, 5000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(5), new NamedThreadFactory("demo-thread-pool", false), new ThreadPoolExecutor.AbortPolicy());
for (int i = 0; i < 10; i++) {
threadPoolExecutor.submit(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
threadPoolExecutor.shutdown();
}
}
结果如下:
demo-thread-pool1
demo-thread-pool4
demo-thread-pool3
demo-thread-pool2
demo-thread-pool5
demo-thread-pool6
demo-thread-pool7
demo-thread-pool8
demo-thread-pool9
demo-thread-pool10
-
可以看出如果我们不对显式创建的线程进行命名,跟踪运行情况时将比较混乱,只能看到类似Thread-6这样的名字。
而使用线程池创建线程,当前线程池创建的线程都有比较统一的命名,是有一定范围的,跟踪运行时比较方便。 -
另外就是使用线程池天然的就能限制住创建线程的数量,有一定的约束,而显式创建线程是不好控制线程的总数的,比如for循环变成100次,显式创建就会创建100个,而线程池就最多会创建20个(maximumPoolSize属性)。