一、创建线程的方法
1、继承Thread类
2、实现Runnable接口
3、实现Callable接口
4、创建线程池获取线程
二、线程的状态
1、NEW状态
2、Runnable状态
3、Blocked状态
4、waiting状态
5、Time_Waiting状态
6、Terminated状态,终止(结束)状态
三、java中的wait和sleep方法的区别?
共同点
wait()、wait(long)和sleep(long)的效果都是让当前线程暂时放弃CPU的使用权,进入阻塞状态?(不是进入waiting状态吗?)
不同点
1、方法归属不同
- sleep(long) 方法时Thread的静态方法
- wait()、wait(long)都是Object的成员方法,每个对象都有
2、醒来时机不同
- 执行sleep(long)和wait(long)的线程都会在等待相应毫秒后醒来
- wait(long)和wait()还可以被notify()(随机唤醒一个线程)和notifyAll()方法唤醒,wait()方法如果不被唤醒就会一直等待下去。
- 他们都可以被打断唤醒
3、锁特性不同(重点)
- wait方法的调用必须先获取wait对象的锁,而sleep方法则无此限制
- wait方法执行后会释放对象的锁,允许其他线程获得该对象的锁
- 而sleep方法如果在synchronized代码块中执行,执行后也不会释放对象的锁(我释放了CPU,但是你们也用不了)。
四、如果停止一个正在运行的线程?
有三种方式可以停止线程
1、使用退出标志,使线程正常退出
2、使用stop方法强制退出(不推荐,stop方法已失效)
3、使用interrupt方法中断线程
- 打断阻塞的线程(sleep、wait、join)的线程,线程会抛出InterruptedException异常
- 打断正常的线程,可以根据打断状态来标记是否退出线程