多线程的创建
方式一:继承于 Thread 类
① 创建一个继承于 Thread 类的子类
② 重写 Thread 类的 run() 方法
③ 创建 Thread 子类的对象
④ 通过此对象调用 start() 方法
方式二:实现Runnable 接口
① 创建一个实现 Runnable 接口的类
② 实现类实现 Runnable 中的抽象方法 run()
③ 创建实现类的对象
④ 将此对象作为参数传递到 Thread 类的构造器中,创建 Thread 类的对象
⑤ 通过 Thread 类的对象调用 start()
方式三:实现Callable 接口
① 创建一个实现 Callable 的实现类
② 实现 Call() 方法
③ 创建 Callable 接口的实现类对象
④ 将③中的对象作为参数传递到 FutureTask 构造器中,创建 FutureTask 的对象
⑤ 将④中的对象作为参数传递到 Thread 类的构造器中,创建 Thread 对象,并调用 start()
- 相比 run() ,有返回值
- 方法可以抛出异常
- 支持泛型的返回值
- 需要借助 FutureTask 类
方式四:线程池
Executors:工具类,线程池的工厂类,用于创建并返回不同类型的线程池
// 单个线程
ExecutorService threadPool = Executors.newSingleThreadExecutor();
// 创建一个固定的线程池大小
ExecutorService threadPool = Executors.newFixedThreadPool(5);
// 灵活的线程池,根据程序安排
ExecutorService threadPool = Executors.newCachedThreadPool();
// 自定义
ExecutorService threadPool = new ThreadPoolExecutor(int corePoolSize, // 核心线程大小
int maximumPoolSize, // 核心线程最大大小
long keepAliveTime, // 超时 释放
TimeUnit unit, // 超时单位
BlockingQueue<Runnable> workQueue, // 阻塞队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler) // 拒绝策略