新建和就绪状态
当程序使用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; } }
相关推荐
本文主要介绍了Java中线程的5种状态(新建(New)、就绪(Runable)、运行(Running)、阻塞(Blocked)和死亡(Dead))之间的转换图解,有需要的朋友可以参考下
线程的生命周期: 解释线程的生命周期,包括新建、就绪、运行、阻塞和终止等状态。探讨线程在不同状态间的转换和原因。 线程的优先级和命名: 介绍线程的优先级概念,解释如何设置线程的优先级。讲解线程命名的重要...
线程生命周期包括:新建 就绪 运行 阻塞 死亡5种状态。 Java高级程序设计-多线程(二)全文共34页,当前为第2页。 本章内容 掌握同步代码块的使用 掌握同步方法的使用 理解线程死锁 掌握 ThreadLocal 类的使用 使用多...
线程要经历开始(等待)、运行、挂起和停止四种不同的状态。这四种状态都可以通过Thread类中的方法进行控制。下面给出了Thread类中和这四种状态相关的方法
(24)线程生命周期中正确的状态是A.新建状态、运行状态和终止状态B.新建状态、运行状态、阻塞状态和终止状态 C.新建状态、可运行状态、运行状态、阻塞状态和终止状态 D.新建状态、可运行状态、运行状态、恢复...
熟悉线程的生命周期及其不同状态,如新建、就绪、运行、阻塞和死亡。 线程同步与通信:掌握Java中的同步机制,如synchronized关键字、wait()和notify()方法,以及更高级的并发工具如ReentrantLock、Condition等。...
第7题 【多选题】【2.00分】【概念理解】 下面哪些选项属于线程生命周期中的状态 * A. 阻塞(正确答案) B. 运行(正确答案) C. 冰冻 D. 新建(正确答案) 第8题 【单选题】【2.00分】【概念理解】 下面哪个方法不可以在...
■ 多线程程序设计,进程和线程的联系和区别,多线程程序设计的一般方法,线程的生命周期,线程状态的控制,多线程的互斥和同步; ■ Java语言的网络编程技术和应用,Socket程序设计,Client/Server程序设计; ...
下面哪些选项属于线程生命周期中的状态() * Java高级程序设计测试含答案全文共40页,当前为第2页。 A.阻塞(正确答案) B.运行(正确答案) C.冰冻 D.新建(正确答案) 下面哪个方法不可以在任何时候被任何线程调用...
■ 多线程程序设计,进程和线程的联系和区别,多线程程序设计的一般方法,线程的生命周期,线程状态的控制,多线程的互斥和同步; ■ Java语言的网络编程技术和应用,Socket程序设计,Client/Server程序设计; ...
■ 多线程程序设计,进程和线程的联系和区别,多线程程序设计的一般方法,线程的生命周期,线程状态的控制,多线程的互斥和同步; ■ Java语言的网络编程技术和应用,Socket程序设计,Client/Server程序设计; ...
java中的线程生命周期中有一些状态,包括new,runnable,running,wait,sleep和终止。 新的: 如果创建Thread类的实例,则线程处于新状态。 例如:线程t = new Thread(); //使用new关键字创建线程类的实例 可...
■ 多线程程序设计,进程和线程的联系和区别,多线程程序设计的一般方法,线程的生命周期,线程状态的控制,多线程的互斥和同步; ■ Java语言的网络编程技术和应用,Socket程序设计,Client/Server程序设计; ...
同时,还讲解了一些关于多线程编程的知识,如线程的生命周期、状态、以及线程安全等问题。 在Java集合框架方面,文章介绍了List、Set和Map的区别和特点,以及它们的使用场景。接下来,文章重点讲解了...
3)运行结果如下图: (2)设置生命周期的Log日志,分别执行相关操作 在hellowordActivity.java文件中依次添加回调函数,分别在各个方法中添加日志监 视语句,复写函数。添加代码如下: package your.helloword; ...
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并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则...
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 ...
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 ...