星期日, 十二月 06, 2015 17:49:26
四、线程的状态
4.1 概念
任何一个线程一般都具有5种状态:
创建、就绪、运行、阻塞、终止
在给定时间点上,一个线程只能处于一种状态
1.new : 至今尚未启动的线程处于的状态
2.runnable: 正在javav虚拟机中执行的线程
3.blocked:受阻塞并等待某个监视器锁的线程
4.waiting: 无限期的等待另一个线程来执行某一特定操作的线程
5.timed_waiting:等待另一个线程来执行取决于指定等待时间的操作的线程
6.te rminated:已退出的线程
4.2取得和设置线程的名称
在Thread类中,可以通过getName()方法取得线程的名称,通过setName()方法设置线程的名称。
线程的名称一般在启动线程前设置,但也允许为已运行的线程设置名称。
允许两个Thread对象有相同的名字,但为了清晰,应该尽量避免这种情况的发生。
另外,如果程序并没有为线程指定名称,系统会自动为线程分配名称。
4.2.1线程名称的分配
355--366 371 379 381
4.2.1代码案例:
package day34; public class ThreadGetName extends Thread{ public static void main(String[] args) { ThreadGetName tgn = new ThreadGetName(); tgn.start(); for(int i =0;i<3;i++) { tgn.printMsg(); } } public void run() { for(int i=0;i<3;i++){ printMsg(); } } @SuppressWarnings("static-access") private void printMsg() { // TODO Auto-generated method stub //获得运行此代码的线程的引用 Thread tn = new Thread(); String name = tn.currentThread().getName(); System.out.println("name --- "+name); } } 运行结果: name --- main name --- main name --- main name --- Thread-0 name --- Thread-0 name --- Thread-0
注意:
1.main()方法也是一个线程,实际上在命令行运行java命令时,就启动了一个JVM的进程,
默认情况下此进程会产生两个线程:
1.一个是main()方法线程 2.一个就是垃圾回收(gc)线程
4.2.2在线程中设置线程的名称
代码案例:
package day34; public class ThreadSetName extends Thread { public static void main(String[] args){ @SuppressWarnings("unused") ThreadSetName tsn = new ThreadSetName(); //设置线程的名称 tsn.setName("test thread"); tsn.start(); for(int i=0;i<3;i++) { tsn.printMsg(); } } public void run() { for(int i =0;i<3;i++) { printMsg(); } } @SuppressWarnings("static-access") private void printMsg() { // TODO Auto-generated method stub Thread trd = new Thread(); String name = trd.currentThread().getName(); System.out.println("name---"+name); } } 运行结果: name---main name---test thread name---main name---test thread name---test thread name---main
4.3判断线程是否启动
在程序中也可以通过isAlive()方法来测试线程是否已经启动而且仍然在启动。
package day34; public class ThreadStartDemo extends Thread { public static void main(String[] args){ @SuppressWarnings("unused") ThreadStartDemo tsn = new ThreadStartDemo(); //设置线程的名称 tsn.setName("test thread"); System.out.println("在调用start()之前,tsn.isAlive() :"+tsn.isAlive()); tsn.start(); System.out.println("在调用start()时,tsn.isAlive() :"+tsn.isAlive()); for(int i=0;i<3;i++) { tsn.printMsg(); } //输出结果是不固定的,true/false System.out.println("main()结束时:"+tsn.isAlive()); } public void run() { for(int i =0;i<3;i++) { printMsg(); } } @SuppressWarnings("static-access") private void printMsg() { // TODO Auto-generated method stub Thread trd = new Thread(); String name = trd.currentThread().getName(); System.out.println("name---"+name); } } 运行结果: 在调用start()之前,tsn.isAlive() :false 在调用start()时,tsn.isAlive() :true name---main name---main name---main main()结束时:true name---test thread name---test thread name---test thread
4.4后台线程与setDaemon()方法
1.对java程序来说,只要还有一个前台线程在运行,这个进程就不会结束。
如果一个进程中只有后台线程在运行,这个进程就会结束。
2.前台线程是相对后台线程而言的,前面所介绍的线程都是前台线程。
3.后台线程:
如果某个线程对象在启动(调用start()方法)之前调用了setDaemon(true)方法,
这个线程就变成了后台线程。
看一下进程中只有后台线程在运行的情况。
4.4.1代码案例package day34; public class ThreadSetDaemon { public static void main(String[] args) { TestThread ttd = new TestThread(); Thread tt = new Thread(ttd); tt.setDaemon(true);//设置后台运行 tt.start(); } } class TestThread implements Runnable { @Override public void run() { // TODO Auto-generated method stub while(true) { System.out.println(Thread.currentThread().getName()+" is running"); } } } 运行结果: Thread-0 is running Thread-0 is running Thread-0 is running Thread-0 is running ....
注意:
从程序和运行结果中:
1.创建了一个无限循环的线程,但因为它是后台线程,
因此整个进程在主线程结束时就随之终止运行了。
2.进行中只有后台线程运行时,进程就会结束。
4.5线程的强制运行
4.5.1 代码案例:
package day34; public class ThreadJoin { public static void main(String[] args) { ThreadJ tj = new ThreadJ(); Thread tr = new Thread(tj); tr.start(); int i =0; for(int k=0;k<6;k++) { if(i == 5) { try { tr.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("main thread :"+(i++)); } } } class ThreadJ implements Runnable { @Override public void run() { // TODO Auto-generated method stub int i = 0; for(int j =0;j<6;j++){ System.out.println(Thread.currentThread().getName()+" "+(i++)); } } } 运行结果: main thread :0 main thread :1 main thread :2 main thread :3 main thread :4 Thread-0 0 Thread-0 1 Thread-0 2 Thread-0 3 Thread-0 4 Thread-0 5 main thread :5
注意:
1.本程序两个线程main()和tj线程
2.调用了tj线程的join()方法,join()是用来强制某一线程的运行。
总结:
1.tj线程中的代码被并入到了main线程中,也就是main线程中的代码等待tj线程执行完。
4.6 线程的休眠
4.6.1代码案例
package day34; public class ThreadSleep extends Thread{ public static void main(String[] args) { ThreadSleep ts = new ThreadSleep(); ts.setName("my worker thread"); ts.start(); try { ts.sleep(700); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }ts.loop(); } @Override public void run() { // TODO Auto-generated method stub loop(); } public void loop() { System.out.println("刚进入loop()方法:"); for(int j =0;j<6;j++){ try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); }System.out.print("离开loop()方法:"); } }
运行结果:
刚进入loop()方法:
刚进入loop()方法:
my worker thread
main
my worker thread
main
my worker thread
main
my worker thread
main
my worker thread
main
my worker thread
离开loop()方法:main
离开loop()方法:
速度慢了很多
4.7 线程的中断
当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它。
未实现
星期日, 十二月 06, 2015 21:45:39
相关推荐
本课程“day02_eesy_01anno_ioc_多线程”主要聚焦于Spring框架的核心特性——IOC(Inversion of Control,控制反转)以及其在多线程环境下的应用。 首先,让我们深入理解什么是IOC。控制反转是一种设计模式,它将...
而在学习的中后期,随着学习者对Java知识的不断积累,它可能会加入更多高级特性,比如图形用户界面(GUI)、文件读写操作、多线程处理等。这样的设计不仅让学习者能够看到自己的进步,也能够激发学习兴趣,提升学习...
Java多线程编程基础知识点 本节课主要讲解了Java多线程编程的基础知识,包括线程的概念、线程与进程的区别、多线程的随机性、Java程序的进程中的线程、线程的创建方式、线程的执行流程、线程内存图等。 1. 进程与...
本资源“day14_多线程01.zip”可能是某个教学课程或者学习资料的一部分,着重讲解了多线程的基础知识和应用。虽然没有具体的标签提供额外信息,但我们可以根据标题和描述来深入探讨多线程这一主题。 多线程是指在一...
"day15_多线程02"这个标题暗示我们将会深入探讨多线程的第二部分,这可能是一个课程或者教程的第十五天内容,重点在于多线程的进阶主题。尽管没有具体的标签,我们可以假设这个压缩包可能包含了源代码、笔记、示例或...
day11-多线程 java
在Java编程语言中,"StringBuffer" 是一个非常重要的类,尤其在处理字符串操作时,尤其是在多线程环境中。在本教程"day13_StringBuffer_java_"中,我们将深入探讨这个类及其在Java中的作用。 Java是C++的优化版本,...
Java的特点包括面向对象、简单性、解释性、高性能、分布式处理、多线程、健壮性、动态、结构中立和安全性等。 Java的简单性体现在它语法上的简洁,对于程序设计来说较为直观易学。解释性指的是Java程序在执行前需要...
头歌java多线程基础-day10.rar
头歌java多线程基础-day11.rar
头歌java多线程基础-day12.rar
4. **多线程**(传智播客_Java培训_毕向东_Java基础[05-多线程].pdf):Java提供了强大的并发支持,多线程编程是其特色之一。这里会涉及线程的创建、同步、协作以及线程安全问题的处理。 5. **集合**(传智播客_...
在“多线程-day02”的学习资源中,我们深入探讨了Java内存模型以及多线程的特性与控制机制。 **Java内存模型** Java内存模型,也称为JVM内存模型,是Java程序员理解和掌握的基础知识,特别是在进行并发编程时。它...
"多线程,day2,B站狂神,代码Lesson.rar"这个资源可能是一个关于Java多线程的第二日课程,由B站(哔哩哔哩)上的一位知名编程讲师,也就是所谓的“狂神”,分享的教学材料,包含有实际的代码示例。 首先,我们来...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在Java中,实现多线程有两种主要方式:通过实现`Runnable`接口和继承`Thread`类。 首先,让我们从创建线程开始。当...
接着,“day26_21(多线程)JDK5实现线程池.avi”将介绍Java 5及更高版本引入的线程池概念。线程池可以优化系统资源的使用,通过复用已创建的线程来减少创建和销毁线程的开销。Executor框架中的ThreadPoolExecutor是...
在本课程"day24-多线程-设计模式"中,我们将深入探讨如何利用多线程结合设计模式来优化程序执行效率。首先,我们要理解的是,多线程是指在一个进程中同时执行多个线程,从而使得程序能够同时处理多个任务,提升系统...
总的来说,Java Web开发中,Tomcat的学习涵盖了服务器的安装、应用部署、Servlet与JSP编程、错误处理以及性能优化等多个方面。通过深入理解和实践,你将能够熟练地利用Tomcat搭建和管理Java Web应用。
8. **多线程**:学习如何创建和管理线程,理解同步和互斥的概念,以及如何避免线程安全问题。 9. **文件和目录操作**:了解如何在Java中进行文件和目录的创建、删除、重命名等操作。 10. **Java API的使用**:书中...
Core Java是Java编程的核心部分,包括面向对象编程、类库、集合框架、输入输出流、多线程、网络编程等方面。在"day2"的学习中,通常会涵盖一些基础但至关重要的概念,比如类与对象的创建、继承、封装、多态等面向...