java多线程(二)-线程的生命周期及线程间通信

时间:2020-11-26 21:18:02

一、摘要

    当我们将线程创建并start时候,它不会一直占据着cpu执行,而是多个线程间会去执行着这个cpu,此时这些线程就会在多个状态之间进行着切换。

  在线程的生命周期中,它会有5种状态,分别为:创建、准备、执行、阻塞、死亡

二、线程生命周期状态详解

  1、创建状态:其实就是new Thread()创建了线程对象,这个时候JVM会为其分配其内存,并初始化成员变量的值

  2、准备状态:指的是线程的对象调用start方法时,这个时候的状态称为准备状态

  3、执行状态:指的是此刻线程会去执行这个cpu,并且会调用线程中的run方法

  4、阻塞状态:指的是当该线程调用sleep(),wait()、suspend()等方法时,这个时候线程就会失去其占用的资源,从而进入到阻塞状态中

  5、死亡状态:指的是当线程执行完run方法时,或者抛出一个异常,或者调用了stop()方法,这个时候就会称为线程死亡

  五个状态之前的切换图如下:

    java多线程(二)-线程的生命周期及线程间通信

三、线程的一些方法调用

  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();
                }
            }
        }
    }
}