/*线程的实现方式总结
* 继承Thread类重写run方法,在方法体中写你的需求。Thread类实现Runnable接口重写run方法
* (建议使用)Runnable接口,实现接口或者使用匿名内部类的格式,重写里面的抽象方法run方法,在方法体中写你的需求
* (建议使用)Callable接口,实现接口或者使用匿名内部类的格式,重写里面的抽象方法call方法,在方法体中写你的需求
*线程和任务分离,解耦合 ,提高代码的健壮性
*避免Java单继承的局限性
*线程池里面只能传入Runnable对象和Callable对象不用new Thread
*
* 使用线程池(Excetors类)里面的静态方法
* ExecutorService a= Executors.newFixedThreadPool(3);创建线程池
* 线程池创建线程方便回收使用
* 特点
* 提高响应速度
* 降低资源消耗
* 提高线程可管理性
*
* 使用其他线程创建(线程池除外)使用完就关闭,
* 重复创建比较浪费资源,线程池使用完不会关闭线程。减少资源消耗
*
* 线程调度方式
* 抢占式调度
* 线程执行无先后顺序根据cpu决定那个任务抢到线程,那个先执行
* 分时调度
*cpu给每个任务分配相同的时间
*
* 线程安全
* 1.保证线程安全使用synchronized锁,把有可能发生异常的代码写到synchronized代码块中。执行完自动释放锁
* 2.使用lock锁,需要手动上锁开锁,代码写到上锁后面开锁前面。
* 3.synchronized方法,代码写道synchronized方法里面
*
* 线程六大状态
* NEW 新建状态:创建一个线程,启动之前,就处于该状态
* RUNNABLE 可运行状态:正在执行run方法中的代码块,就处于该状态
* BLOCKED 阻塞状态:获取synchronized锁对象失败,就处于该状态
* WAITING 无限等待状态:获取lock锁对象失败,就处于该状态
* TIMED_WAITING 计时等待状态:正在执行sleep方法时,就处于该状态
* TERMINATED 消亡状态:线程执行完任务,就处于该状态
*
* 每一个线程启动都会创建一个栈,各自在各自栈中执行任务
* 线程的开销比一般对象的开销大
*
*
* */