zoukankan      html  css  js  c++  java
  • 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();
                    }
                }
            }
        }
    }
    
  • 相关阅读:
    hdu acm 2844 Coins 解题报告
    hdu 1963 Investment 解题报告
    codeforces 454B. Little Pony and Sort by Shift 解题报告
    广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告
    hdu acm 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
    hdu acm 1114 Piggy-Bank 解题报告
    poj 2531 Network Saboteur 解题报告
    数据库范式
    ngnix 配置CI框架 与 CI的简单使用
    Vundle的安装
  • 原文地址:https://www.cnblogs.com/cczequn/p/8645677.html
Copyright © 2011-2022 走看看