Java并发编程:线程的生命周期是个怎样的过程?

 

前言

在日常开发过程中,如果我们需要执行一些比较耗时的程序的话,一般来说都是开启一个新线程,把耗时的代码放在线程里,然后开启线程执行。但线程是会耗费系统资源的,如果有多个线程同时运行,互相之间抢占系统资源,那无疑会对系统造成极大的压力。所以,怎么操作线程,保证不影响整个应用功能是很重要的,而这就需要我们了解线程的生命周期了。

线程的生命周期

线程的生命周期有6种状态,分别是NEW(新建)、RUNNABLE(可运行)、BLOCKED(被阻塞)、 WAITING(等待)、TIMED_WAITING(计时等待)、TERMINATED(被终止),在 Thread 源码的 State 枚举中都有定义:

public static enum State {     NEW,     RUNNABLE,     BLOCKED,     WAITING,     TIMED_WAITING,     TERMINATED;      private State() {     } }

1、NEW 状态表示刚刚创建的线程,此时的线程还没运行,也就是还没执行start() 方法,创建线程的方式也比较简单,可以参考《Java并发知识:Java创建线程的三种方式》。

2、当线程执行时,处于 RUNNABLE状态,表示线程所需的资源已经准备好了。

3、如果线程在执行的过程中遇到被阻塞的情况,例如线程中的程序中有synchronized 同步代码块,线程就会暂停执行,进入阻塞状态,直至获取请求的锁,这时线程就处于 BLOCKED状态。

实例代码如下:

public class ThreadDemo {          public static Object testObject = new Object();      public static class MyThread extends Thread {          public MyThread(String name) {             super.setName(name);         }          @Override         public void run() {             //每次跑run方法都需要获取testObject对象             synchronized (testObject) {                 System.out.println("thread name:" + this.getName());                  //..............耗时操作..............             }         }      }      public static void main(String[] args) {         for (int i = 1; i <= 100; i++) {             new MyThread("线程"+i).start();         }     } }

在上面的代码中,线程的run方法在执行耗时的程序之前都需要先获取testobject对象的锁,因为对象锁是公共对象,所以,多个线程同时运行时,同一时刻只能有一个线程获取锁,假设某个时刻是 A线程 获取了锁,其他线程就会处于等待锁释放的阻塞状态,直到获取锁才能继续执行程序,这就是线程的BLOCKED 状态。

4、WAITING 表示等待的状态,处于 WAITING 状态的线程会进入一个无时间限制的等待,一旦等到了期望的事件,线程就会再次执行,进入RUNNABLE 状态。最典型的场景就是 等待(wait) 和 通知(notify)

等待状态对应的方法是wait(),而通知是notify(),这两个方法并不属于Thread类,而是属于Object类,所以所有对象都可以使用这两个方法。当一个对象实例 obj 调用 wait() 方法后,当前线程就会在这个对象上等待,直到其他线程调用 obj.notify() 为止。这时的对象实例 obj 就相当于多个线程之间的通信工具。实例代码如下:

public class ThreadDemo {      public static Object testObject = new Object();      public static class MyThread1 extends Thread {         @Override         public void run() {             synchronized (testObject) {                 System.out.println("MyThread1 wait :" + System.currentTimeMillis());                 try {                     //调用wait方法进入等待状态                     testObject.wait();                 } catch (InterruptedException e) {                     e.printStackTrace();                 }             }         }     }      public static class MyThread2 extends 

                    
                
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信