一、摘要
当我们将线程创建并start时候,它不会一直占据着cpu执行,而是多个线程间会去执行着这个cpu,此时这些线程就会在多个状态之间进行着切换。
在线程的生命周期中,它会有5种状态,分别为:创建、准备、执行、阻塞、死亡
二、线程生命周期状态详解
1、创建状态:其实就是new Thread()创建了线程对象,这个时候JVM会为其分配其内存,并初始化成员变量的值
2、准备状态:指的是线程的对象调用start方法时,这个时候的状态称为准备状态
3、执行状态:指的是此刻线程会去执行这个cpu,并且会调用线程中的run方法
4、阻塞状态:指的是当该线程调用sleep(),wait()、suspend()等方法时,这个时候线程就会失去其占用的资源,从而进入到阻塞状态中
5、死亡状态:指的是当线程执行完run方法时,或者抛出一个异常,或者调用了stop()方法,这个时候就会称为线程死亡
五个状态之前的切换图如下:
三、线程的一些方法调用
1、sleep()方法:此方法指的是线程会进行睡眠,进入到阻塞状态,直到时间结束时会自动醒来,但在此过程中不会去抢夺cpu,但不会释放锁,同时醒来后也不会立即就能执行,仍然需要去进行抢夺
2、wait()方法:此方法会将线程进入到阻塞状态,不会去抢夺cpu,但是会释放锁,直到被其他线程唤醒后,才会去接着执行,醒来也不一定会立即能执行,仍然需要去抢夺cpu和锁才能执行
3、notify()方法:此方法会将线程进行唤醒,如果有多个线程被wait住,此时notify会随机去唤醒一个线程,醒来后的线程仍然需要去抢夺cpu和锁资源
4、notifyAll()方法:此方法会唤醒所有的线程
5、stop()方法:停止当前线程,但方法过时,不推荐使用
6、interrupt()方法:该方法会对当前线程进行中断标志设计,将中断标志设为true后,如果后面线程调用了wait()、join()、sleep()三者任一方法,则会抛出中断异常,从而停止当前线程的执行
7、setDaemon()方法:该方法称为守护线程,即当线程结束时,从属于这个线程的守护线程也会结束
8、join()方法:即临时加入一个线程,此时当前线程会进入到阻塞状态,直到临时加入的线程执行完之后,当前线程才会去执行
9、setPriority():设置线程执行优先度
10、yield() :暂停当前线程,执行其他线程
四、线程间的通信
利用上述wait()、notifyAll方法可以对线程间进行调用,案例代码如下:
public class ProConsDemo {
public static void main(String[] args) {
Person person=new Person();
new Thread(new Pro(person)).start();
new Thread(new Cons(person)).start();
}
}
class Person{
String person=null;
}
class Pro implements Runnable{
private Person person;
public Pro(Person person) {
this.person = person;
}
long i=0;
@Override
public void run() {
while(true){
synchronized (person){
person.person="name"+i;
System.out.println("生产了"+person.person);
i++;
try {
person.notify();
person.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class Cons implements Runnable{
private Person person;
public Cons(Person person) {
this.person = person;
}
@Override
public void run() {
while (true){
synchronized (person){
System.out.println("消费了"+person.person);
try {
person.notify();
person.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}