线程
线程启动
Thread thread = new Thread();
thread.start();
- new Tread()仅仅是在JVM中构建了线程对象
- start() 这个方法将调用本地方法(JNI)来实现一个真正意义上的线程,此时会在OS级别进行线程的真正创建
- run()方法定义了线程的逻辑
线程状态
- NEW :线程在没有进行start之前,本质上还不是一个线程,仅仅是JVM中外壳对象
- Runnable:线程发生start之后的状态,也可以理解为存活的正在尝试征用CPU的线程,从Java本身层面上讲,这个状态并不代表一定处于运行状态的线程
- BLOCKED:处于阻塞状态,或者线程已经被挂起
- WAITING:线程拥有对象锁之后进入到相应的代码区域后,调用相应的对象wait方法后产生的结果
- TIMED_WAITING:当调用Thread.sleep的方法时,相当于使用某个时间资源作为锁对象,进而达到等待的目的
- TERMINATED:线程刚刚运行完,即执行完用户逻辑
线程实现
- extend Thread
- implements Runnable
- implements Callable
实现特点
- 对于继承和实现的利弊:关注于java单继承体系问题
- Runnable 和Callable特点
- Runnable实现run(),Callable实现call()
- run中不可以抛出异常,在使用不当时,可能造成定时任务卡死(Timer实现的情况下);call方法可以抛出异常,并且具有返回值
- Callable和Runnable都可以应用于executors。而Thread类只支持Runnable
- Callable适用于异步的数据获取
线程终止
- stop :比较粗暴,无论线程执行到哪里,它将会立即停止掉线程。当线程处于RUNNABLE状态时,使用stop方法,Thread将会抛出java.lang.ThreadDeath 的ERROR
- interrupt :调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己。