线程的创建方式
1 继承Thread类创建线程任务
- 优点:可以直接使用Thread类中的方法,代码简单
- 缺点:继承Thread类之后就不能继承其他的类
1.自定义一个类,继承java.lang包下的Thread类
2.重写run方法
3.将要在线程中执行的代码编写在run方法中
4.创建上面自定义类的对象
5.调用start方法启动线程
2 实现Runnable接口创建线程
- 优点:自定义类已经有父类了也不受影响,因为可以实现多个接口
- 缺点:在run方法内部需要获取到当前线程的Thread对象后才能使用Thread中的方法
1.自定义一个类,实现java.lang包下的Runnable接口
2.重写run方法
3.将要在线程中执行的代码编写在run方法中
4.创建上面自定义类的对象
5.创建Thread对象并将上面自定义类的对象作为参数传递给Thread的构造方法
6.调用start方法启动线程
3 实现Callable接口创建线程
- 优点:可以获取返回值,可以抛出异常
- 缺点:代码编写较为复杂
1.自定义一个类,实现java.util.concurrent包下的Callable接口
2.重写call方法
3.将要在线程中执行的代码编写在call方法中
4.创建FutureTask对象
5.将自定义类的对象传入FutureTask构造方法里面
6.创建Thread线程对象
7.将FutureTask对象传入Thread构造方法中
线程的生命周期
1.新建线程,创建一个线程的对象。
2.线程对象创建好之后进入就绪状态,此时会等待获取CPU的执行权。
3.获取到CPU执行权之后,线程对象开始运行。
4.在线程对象运行的过程中有可能CPU会切换到其他线程上面,此时会失去执行权重新回到第二步进入就绪状态。
5.如果线程对象在执行过程中遇到了wait方法或者sleep方法,线程将会进入到阻塞状态。
6.线程对象执行结束后会变成死亡状态。