Java线程池
两种线程模型
-
ULT 用户级线程
应用提供创建、同步、调度和管理线程的函数来个控制用户线程,不依赖操作系统核心
不需要用户/内核态的切换,速度快
操作系统内核对ULT无感知,线程阻塞则进程阻塞
-
KLT 内核级线程
线程的创建、调度和管理由内完成,效率比UTLT慢
内核保存线程的状态和上下文信息
线程阻塞不会引起进程阻塞
Java虚拟机使用的是基本是KLT内核级线程模型
线程是程序运行的载体,是一种稀缺的资源,它的创建与销毁是一个相对偏重且耗资源的操作,Java依赖于内核线程,创建线程需要进行操作系统状态切换,为避免资源过度消耗需要设法重用线程执行多个任务,线程池就是一个线程缓存,负责对线程进行统一分配、调度于监控
- 使用线程池的场景
- 单个任务处理时间比较短
- 需要处理的任务数量很大
- 线程池的优点
- 重用存在的线程,减少线程创建,消亡的开销,提高性能
- 提高响应速度,当任务到达的时候,任务可以不需要等到线程创建就能立执行
- 提高线程的可管理性,可统一分配、调度和监控
向线程池提交任务
-
execute方法
用于提供不需要返回值的任务
-
submit方法
用于提交需要由返回值的任务,线程池会返回一个future类型的对象,通过这个对象可以判断是否执行成功
关闭线程
- shutdown方法
- shutdownNow方法
package Tread;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadServiceDemo {
public static void main(String[] args) {
//创建一个线程池对象
//newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。
ExecutorService pool = Executors.newFixedThreadPool(2);
//往线程池里面提交对象
pool.submit(new MyRunnable());
pool.submit(new MyRunnable());
pool.submit(new MyRunnable());
pool.submit(new MyRunnable());
pool.submit(new MyRunnable());
//关闭线程池对象
pool.shutdown();
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":");
}
}