Java并发编程(一):线程的5种状态、3种创建方式
多线程这个概念大家已经相当熟悉了,概念性的东西就不多说了。我们要讲解的内容如下:
线程的5种状态、创建线程的3种方式及其区别。
一.线程的5种状态
1.新建状态
使用new关键字建立一个线程对象后,程序start()这个线程之前都是新建状态。
2.就绪状态
线程对象调用start()之后线程进入就绪状态,在就绪队列中等待JVM的线程调度器调度。
3.运行状态
就绪状态的线程获取到CPU资源就可以执行run(),线程变为运行状态。
4.阻塞状态
失去占用资源会使线程变为阻塞状态,根据失去资源的方式或原因阻塞状态分为3种。
等待阻塞:线程执行wait()方法。
同步阻塞:线程获取synchronized同步锁失败。
其它阻塞:sleep()、join()、IO请求,都会使线程进入阻塞状态。
5.死亡状态
任务执行完成或者终止条件发生,线程进入终止状态。
二.创建线程的3种方式
1.继承Thread类
1.1.实现步骤:
1.创建继承Thread的子类,并重写run()方法。
2.创建子类的实例对象。
3.子类实例对象调用start()方法启动线程。
1.2.代码示例:
2.实现Runnable接口
2.1.实现步骤:
1.创建Runnable的实现类,并实现run()方法。
2.创建实现类的实例对象,并用这个实例对象作为Thread的target创建Thread线程对象。
3.Thread线程对象调用start()方法启动线程。
2.2.代码示例:
3.实现Callable接口
3.1.实现步骤:
1.创建Callable的实现类,并实现call()方法,然后创建这个实现类的实例。这里我们不写实现类,而是采用更方便的Lambda表达式。
2.使用FutureTask类包装Callable对象。
3.使用FutureTask对象作为Thread对象的target创建Thread线程对象并调用start()方法启动线程。
4.调用FutureTask对象的get()方法获得子线程执行结束后的返回结果。
3.2.代码示例:
三.3种创建方式的区别
1.实现Runnable、Callable接口的区别
- 基本相同,区别是Callable的call()方法有返回值。
2.实现接口和继承Thread的区别
- 继承Thread类就不能再继承其它类,而实现接口还可以继承其它类。
- 实现接口的方式多个线程可以共享同一target。