`

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中线程的5种状态(新建(New)、就绪(Runable)、运行(Running)、阻塞(Blocked)和死亡(Dead))之间的转换图解,有需要的朋友可以参考下

    java并发编程:线程基础

    线程的生命周期: 解释线程的生命周期,包括新建、就绪、运行、阻塞和终止等状态。探讨线程在不同状态间的转换和原因。 线程的优先级和命名: 介绍线程的优先级概念,解释如何设置线程的优先级。讲解线程命名的重要...

    Java高级程序设计-多线程(二).pptx

    线程生命周期包括:新建 就绪 运行 阻塞 死亡5种状态。 Java高级程序设计-多线程(二)全文共34页,当前为第2页。 本章内容 掌握同步代码块的使用 掌握同步方法的使用 理解线程死锁 掌握 ThreadLocal 类的使用 使用多...

    java多线程编程之线程的生命周期

    线程要经历开始(等待)、运行、挂起和停止四种不同的状态。这四种状态都可以通过Thread类中的方法进行控制。下面给出了Thread类中和这四种状态相关的方法

    二级Java笔试真题及答案

    (24)线程生命周期中正确的状态是A.新建状态、运行状态和终止状态B.新建状态、运行状态、阻塞状态和终止状态 C.新建状态、可运行状态、运行状态、阻塞状态和终止状态 D.新建状态、可运行状态、运行状态、恢复...

    Java并发编程基础.pdf

    熟悉线程的生命周期及其不同状态,如新建、就绪、运行、阻塞和死亡。 线程同步与通信:掌握Java中的同步机制,如synchronized关键字、wait()和notify()方法,以及更高级的并发工具如ReentrantLock、Condition等。...

    JAVA高级程序设计测试题含答案.docx

    第7题 【多选题】【2.00分】【概念理解】 下面哪些选项属于线程生命周期中的状态 * A. 阻塞(正确答案) B. 运行(正确答案) C. 冰冻 D. 新建(正确答案) 第8题 【单选题】【2.00分】【概念理解】 下面哪个方法不可以在...

    Java清华教程.rar

     ■ 多线程程序设计,进程和线程的联系和区别,多线程程序设计的一般方法,线程的生命周期,线程状态的控制,多线程的互斥和同步;  ■ Java语言的网络编程技术和应用,Socket程序设计,Client/Server程序设计; ...

    Java高级程序设计测试含答案.docx

    下面哪些选项属于线程生命周期中的状态() * Java高级程序设计测试含答案全文共40页,当前为第2页。 A.阻塞(正确答案) B.运行(正确答案) C.冰冻 D.新建(正确答案) 下面哪个方法不可以在任何时候被任何线程调用...

    清华大学java教程

     ■ 多线程程序设计,进程和线程的联系和区别,多线程程序设计的一般方法,线程的生命周期,线程状态的控制,多线程的互斥和同步;  ■ Java语言的网络编程技术和应用,Socket程序设计,Client/Server程序设计; ...

    JAVA清华教程 详细

     ■ 多线程程序设计,进程和线程的联系和区别,多线程程序设计的一般方法,线程的生命周期,线程状态的控制,多线程的互斥和同步;  ■ Java语言的网络编程技术和应用,Socket程序设计,Client/Server程序设计; ...

    LearningJava

    java中的线程生命周期中有一些状态,包括new,runnable,running,wait,sleep和终止。 新的: 如果创建Thread类的实例,则线程处于新状态。 例如:线程t = new Thread(); //使用new关键字创建线程类的实例 可...

    [清华大学]JAVA教程

     ■ 多线程程序设计,进程和线程的联系和区别,多线程程序设计的一般方法,线程的生命周期,线程状态的控制,多线程的互斥和同步;  ■ Java语言的网络编程技术和应用,Socket程序设计,Client/Server程序设计; ...

    JAVA面试常见问题整理

    同时,还讲解了一些关于多线程编程的知识,如线程的生命周期、状态、以及线程安全等问题。 在Java集合框架方面,文章介绍了List、Set和Map的区别和特点,以及它们的使用场景。接下来,文章重点讲解了...

    实验一Android环境构建与Activity生命周期.doc

    3)运行结果如下图: (2)设置生命周期的Log日志,分别执行相关操作 在hellowordActivity.java文件中依次添加回调函数,分别在各个方法中添加日志监 视语句,复写函数。添加代码如下: package your.helloword; ...

    java初学者必看

    1.7.2 Java虚拟机的生命周期 1.7.3 Java虚拟机的体系结构 1.8 垃圾收集器 1.9 本章习题 第2章 Java开发环境 2.1 J2SE的下载和安装 2.1.1 J2SE的下载 2.1.2 J2SE的安装 2.2 环境变量的配置与测试 2.2.1 设置...

    Java并发编程实战

    本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则...

    疯狂JAVA讲义

    1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢? 8 ...

    java基础案例与开发详解案例源码全

    12.2 线程的生命周期309 12.2.1 线程的状态及转换310 12.2.2 线程睡眠311 12.2.3 线程让步313 12.2.4 线程的加入313 12.3 线程的调度和优先级314 12.4 线程的同步315 12.4.1 线程同步的方法317 12.4.2 对象锁319 ...

Global site tag (gtag.js) - Google Analytics