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


    一、摘要

        当我们将线程创建并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();
                    }
                }
            }
        }
    }
    
  • 相关阅读:
    mysql 为表添加索引
    南开大学2021年高等代数考研试题参考解答
    南开大学2021年数学分析考研试题参考解答
    中国人民大学2021年数学分析考研试题参考解答
    河北工业大学2021数分高代考研
    西南大学2021高等代数考研
    西南大学2021数学分析考研
    重庆大学2021数学分析考研
    [数学考研竞赛00076]武汉大学2021年高等代数考研试题参考解答
    华东师范大学2021年高等代数考研试题参考解答
  • 原文地址:https://www.cnblogs.com/cczequn/p/8645677.html
Copyright © 2020-2023  润新知