博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java多线程(二)-线程的生命周期及线程间通信
阅读量:4591 次
发布时间:2019-06-09

本文共 2792 字,大约阅读时间需要 9 分钟。

一、摘要

    当我们将线程创建并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();                }            }        }    }}

 

转载于:https://www.cnblogs.com/cczequn/p/8645677.html

你可能感兴趣的文章
画坦克__线程__V1__第一种方法创造线程
查看>>
Tree (四校联考T1)
查看>>
javascript动态合并表格相同的单元格
查看>>
CRM项目上线第一天
查看>>
对象属性特性(可写,可枚举,可配置)
查看>>
5.16
查看>>
Dom EVENT对象
查看>>
[BZOJ3531][Sdoi2014]旅行 树链剖分
查看>>
mybatis运行原理(面试回答)
查看>>
软件结构与环境配置概述
查看>>
20171122
查看>>
CSS3box-shadow属性的使用
查看>>
快速找到未知长度的单链表的中间结点
查看>>
20180320作业1:源代码管理工具调查
查看>>
Python知乎热门话题数据的爬取实战
查看>>
软件管理
查看>>
数论专题
查看>>
Spark集群的运行流程
查看>>
markdown 入门教程(完整版)
查看>>
一种新的人机交流方式——sound ware 声件
查看>>