线程的四种创建方式
- 定义一个类继承Thread类,并重写Thread类的run()方法
- 定义Runnable接口的实现类,重写run()方法
- 实现callback接口
- 通过线程池创建
四种创建方式对比
- 采用继承Thread类方式:
- 优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
- 缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
- 采用实现Runnable接口方式:
- 优点:线程类只是实现了Runable接口,还可以继承其他的类。
- 缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法
- Runnable和Callable的区别:
- Callable规定的方法是call(),Runnable规定的方法是run().
- Callable的任务执行后可返回值,而Runnable的任务是没有返回值的
- call方法可以抛出异常,run方法不可以,因为run方法本身没有抛出异常,所以自定义的线程类在重写run的时候也无法抛出异常
- 线程池:
- 前三种的线程如果创建关闭频繁会消耗系统资源影响性能,而使用线程池可以不用线程的时候放回线程池,用的时候再从线程池取,项目开发中主要使用线程池
- start()方法用来,开启线程,但是线程开启后并没有立即执行,他需要获取cpu的执行权才可以执行
- run()方法是由jvm创建完本地操作系统级线程后回调的方法,不可以手动调用(否则就是普通方法)
线程的核心参数
- corePoolSize 线程池核心线程大小
- maximumPoolSize 线程池最大线程数量
- keepAliveTime 空闲线程存活时间
- unit 空闲线程存活时间单位
- workQueue 工作队列
- threadFactory 线程工厂
- handler 拒绝策略
线程状态
- NEW: 新建状态,线程还没有启动
- RUNNABLE: 可以运行状态,线程调用了start()方法后处于这个状态
- BLOCKED: 锁阻塞状态,没有获取到锁处于这个状态
- WAITING: 无限等待状态,线程执行时被调用了wait方法处于这个状态
- TIMED_WAITING: 计时等待状态,线程执行时被调用了sleep(毫秒)或者wait(毫秒)方法处于这个状态
- TERMINATED: 终止状态, 线程执行完毕或者遇到异常时,处于这个状态。
要确定一个线程的当前状态,可调用getState方法
线程的生命周期