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

一、摘要

    当我们将线程创建并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();
}
}
}
}
}
上一篇:(Java多线程系列二)线程间同步


下一篇:运用Turtle实现汉诺塔的可视化运行(递归算法)