`

Java线程的运行状态(线程的生命周期)

 
阅读更多


 

 

 

新建和就绪状态

当程序使用new关键字创建了一个线程后,该线程就处于新建状态. JVM为Thread对象分配内存.初始化其成员变量的值.

 

线程对象调用start()方法之后,该线程处于就绪状态. JVM会为其创建方法调用栈和程序计数器.

就绪状态的线程并没有开始运行,它只是表示该线程可以运行了. JVM的线程调度器调度该线程运行.

 

注意:

1.调用start()启动线程之后,run()方法才会被看作线程执行体.

2.直接调用run()方法,则run()方法就只是一个普通方法.

 

 

运行和阻塞状态

就绪状态的线程获得了CPU,开始执行run方法的线程执行体.则该线程处于运行状态.

线程在执行过程中可能会被中断,以使其他线程获得执行的机会,线程调度取决于底层平台采用的策略.

 

现代桌面和服务器操作系统一般都采用抢占式策略。一些小型设备如手机则可能采用协作式调度.

抢占式策略的系统:系统给每个可执行的线程一个小时间段来处理任务;当该时间段用完,系统会剥夺该线程所占有的资源,让其他线程获得执行机会.在选择下一个线程时,系统会考虑线程的优先级.

 

线程进入阻塞状态:

1.线程调用sleep方法主动放弃所占用的处理器资源.

2.线程调用了一个阻塞式的IO方法,该方法返回之前,该线程被阻塞.

3.线程试图获得一个同步监视器,但同步监视器正被其他线程所持有.

4.线程在等待某个通知(notify).

5.线程调用了线程的suspend方法将线程挂起.不过这个方法容易导致死锁,所以程序应该尽量避免使用该方法.

 

阻塞线程重写进入就绪状态:

1.调用sleep方法的线程经过了指定的时间.

2.线程调用的阻塞式IO方法已经返回.

3.线程成功地获得了试图取得同步监视器.

4.线程正在等待某个通知时,其他线程发出了一个通知.

5.处于关闭状态的线程被调用了resume恢复方法.

 

 

线程死亡

线程在以下情况下死亡:

run()方法执行完成,线程正常结束.

线程抛出一个未捕获的Exception或Error.

直接调用该线程的stop()方法来结束该线程.该方法容易导致死锁,通常不推荐使用.

 

Thread对象的isAlive()方法,查看线程是否死亡。

 

注意:

死亡的线程不能再用start()方法重新启动。

一个线程的start()方法不能两次调用。

 

 

 

线程睡眠:sleep

sleep方法,将线程转入阻塞状态.时间到即再转入就绪状态.

 

 

线程让步:yeild

yeild()方法,将线程转入就绪状态。该方法让线程暂停一下,让系统重新调度一次。

 

 

sleep方法和yeild方法的区别:

sleep方法暂停期间不会给其他线程执行机会.

sleep方法会将线程转入阻塞状态,知道经过阻塞时间才会转入就绪状态.yeild直接把线程转入就绪状态.

sleep方法抛出InterruptedException异常,所以调用sleep()时要捕捉或抛出异常.而yeild()方法则没有声明抛出任何异常.

sleep方法比yeild法那个发有更好的移植性,通常不要依靠yeild来控制并发线程的执行.

 

join线程

在某个线程的执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join方法加入的join线程完成为止。

例:

public class TestJoin {
  public static void main(String[] args) {
    MyThread2 t1 = new MyThread2("abcde");
    t1.start();
    try {
    	t1.join();
    } catch (InterruptedException e) {}
    	
    for(int i=1;i<=10;i++){
      System.out.println("i am main thread");
    }
  }
}
class MyThread2 extends Thread {
  MyThread2(String s){
  	super(s);
  }
  
  public void run(){
    for(int i =1;i<=10;i++){
      System.out.println("i am "+getName());
      try {
      	sleep(1000);
      } catch (InterruptedException e) {
      	return;
      }
    }
  }
}

 

 

 

 

 

线程优先级

每个线程都有优先级.优先级高的线程获得较多的执行机会.

默认情况下,main线程具有普通优先级.

每个线程默认优先级与创建它的父线程具有同样的优先级. 

 

Java提供的优先级范围是1~10.默认优先级为5.

Thread提供静态常量:

static int MAX_PRIORITY 线程可以具有的最高优先级。 值为10.

static int MIN_PRIORITY 线程可以具有的最低优先级。值为1.

static int NORM_PRIORITY 分配给线程的默认优先级。值为5.

 

注意:

不同操作系统的优先级不同.应尽量避免直接为线程指定优先级,而应使用以上三个静态常量类设置优先级.

 

 

 

 

后台线程

运行在后台,用于为其他线程提供服务.又称为”守护线程”.

如果所有前台线程死亡,后台线程也会死亡.

 

调用Thread对象的setDeamon(true)方法可以将指定线程设置成后台线程.

所有前台线程死亡时,后台线程随之死亡.

 

Thread对象的isDeamon()方法用于判断指定线程是否为后台线程.

 

说明:

main方法的主线程是前台线程.

前台线程创建的线程默认是前台线程.

后台线程创建的线程默认是后台线程.

 

 

 

停止线程

需要停止线程不要去调用stop()方法。而是为线程类设置一个运行标志符。

例:

public class TestThread4 {	
	public static void main(String args[]){
		Runner4 r = new Runner4();
       	Thread t = new Thread(r);
        t.start();
        for(int i=0;i<100000;i++){
        	if(i%10000==0 & i>0)
        		System.out.println("in thread main i=" + i);
        }
        System.out.println("Thread main is over");
        r.shutDown();
        //t.stop();
    }
}

class Runner4 implements Runnable {
  private boolean flag=true;
  
	public void run() {
		int i = 0;
		while (flag==true) {
			System.out.print(" " + i++);	
		}
	}
	
  public void shutDown() {
		flag = false;
  }
}

 

 

 

 

 

 

 
  • 大小: 31.2 KB
分享到:
评论

相关推荐

    Java线程状态流转图

    Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换规则。 NEW(初始化状态) 在Java...

    java线程状态转换图

    本文将详细介绍 Java 线程状态转换图,包括初始状态、可运行状态、运行状态、阻塞状态、锁池状态、等待队列状态和终止状态七种状态的定义、特点和转换关系。 初始状态(Newborn) * 线程的实现有两种方式,一是...

    Java多线程(二)、线程的生命周期和状态控制

    ### Java多线程之线程的生命周期和状态控制 #### 一、线程的生命周期 在Java中,线程的生命周期是指线程从创建到结束的整个过程。根据线程的状态变化,我们可以将线程的生命周期划分为以下几个阶段: 1. **新建...

    Java源码查看线程的运行状态.rar

    线程在Java中由`java.lang.Thread`类表示,其生命周期包括以下几种状态: 1. **新建**(New):当使用`new Thread()`创建了一个线程对象时,线程处于新建状态。 2. **可运行**(Runnable):调用`start()`方法后,...

    Java多线程-线程的生命周期

    线程生命周期的终点是死亡状态。线程在以下三种情况下结束:`run()`方法执行完毕、执行过程中抛出未捕获异常或错误,或者调用已过时的`stop()`方法。 6. 等待(Waiting): 从JDK1.5开始,线程可以进入等待状态,这...

    Java线程详解大全

    本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要。线程是程序中一个单一的顺序控制流,它在程序的上下文中运行,但具有独立的执行路径。多线程则是指在...

    Java线程生命周期.zip

    Java线程生命周期是Java编程中的核心概念,它关乎程序的并发执行和性能优化。线程在Java中扮演着至关重要的角色,特别是在多任务处理和实时系统中。理解线程的生命周期有助于开发者更有效地管理和控制程序运行流程。...

    java线程.pdf

    ### Java线程生命周期 Java线程有五种基本状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。线程的状态会随着程序的运行而变化: 1. **新建**:当创建了一个新的线程...

    4初学Java多线程:线程的生命周期.pdf

    在探讨Java多线程和线程生命周期时,我们首先应该明确,Java多线程是Java语言支持并发编程的一个重要特性,其允许同时执行多个任务,以提高程序的执行效率和改善用户体验。Java中的每个线程都有自己的生命周期,由一...

    Java多线程知识点总结

    在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)和死亡状态(Dead)。了解这些状态对于掌握Java多线程编程至关重要。 新建...

    Java线程的生命周期和状态控制[定义].pdf

    Java线程的生命周期和状态控制是Java多线程编程中的核心概念。线程的状态转换是理解线程行为的关键,这包括新建状态、就绪状态、运行状态、阻塞状态和死亡状态。 1. 新建状态:当使用`new`关键字创建了一个`Thread`...

    JAVA多线程练习题答案。

    这些题目涵盖了 JAVA 多线程编程的基本概念和技术,包括线程的生命周期、线程同步、线程状态、线程优先级、线程安全等方面。 一、单项选择题 在单项选择题中,我们可以看到各种关于 JAVA 多线程编程的基本概念和...

    JAVA线程学习(源代码)

    线程的生命周期包括新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)七个状态。Java提供了多种方法来控制线程状态,如`start...

    关于线程(java)两天的课件

    Java线程有五种基本状态:新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。这些状态之间的转换是通过调用特定的方法,如start()、sleep()、join()、wait()、notify()等...

    java线程入门级书籍

    #### 五、Java线程的生命周期 Java线程的状态可以分为新建、就绪、运行、阻塞和死亡五个阶段。 - **新建状态**:当使用`new`关键字创建一个线程对象后,该线程处于新建状态。 - **就绪状态**:调用`start()`方法后...

    java多线程的讲解和实战

    每个线程都有自己的生命周期,包括新建、就绪、运行、阻塞和结束五个状态。 2. **创建线程的方式**: - 继承`Thread`类:创建一个新的类,继承自`Thread`,重写`run()`方法,然后创建该类的实例并调用`start()`...

    Java线程培训资料

    - **运行状态**:获得CPU时间片后,线程开始执行。 - **阻塞状态**:线程因为等待某个事件发生而无法继续执行,如调用`sleep()`方法或等待锁。 - **死亡状态**:线程执行完毕或被异常终止。 3. **线程的优先级**...

    Java线程状态转换.pdf

    6. **终止状态 (Terminated)**: 当线程的`run()`方法执行完毕或因异常结束,线程将进入终止状态,表示线程生命周期结束。 在实际的多线程程序中,线程状态的转换可能会非常复杂,特别是在处理同步和并发控制时。...

    JAVA技巧(Java多线程运行时,减少内存占用量).pdf

    Java中的线程生命周期包括新建(New)、可运行(Runnable)、阻塞(Blocked)、等待(Waiting)、定时等待(Timed Waiting)和终止(Terminated)这几种状态。在多线程运行过程中,每个线程都需要分配一定的内存资源...

    Java多线程机制(讲述java里面与多线程有关的函数)

    线程的生命周期始于新建,通过调用start()方法进入就绪状态,然后可能进入运行、阻塞或等待,最后在run()方法执行完毕后死亡。 9.2 Thread的子类创建线程: 创建线程的一种方式是创建Thread类的子类,并重写run()...

Global site tag (gtag.js) - Google Analytics