`
阅读更多

星期日, 十二月 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

0
1
分享到:
评论

相关推荐

    day02_eesy_01anno_ioc_多线程_

    本课程“day02_eesy_01anno_ioc_多线程”主要聚焦于Spring框架的核心特性——IOC(Inversion of Control,控制反转)以及其在多线程环境下的应用。 首先,让我们深入理解什么是IOC。控制反转是一种设计模式,它将...

    21day_learn_java.rar_DayCounter.java

    而在学习的中后期,随着学习者对Java知识的不断积累,它可能会加入更多高级特性,比如图形用户界面(GUI)、文件读写操作、多线程处理等。这样的设计不仅让学习者能够看到自己的进步,也能够激发学习兴趣,提升学习...

    day17_线程创建、线程同步、线程状态.pdf

    Java多线程编程基础知识点 本节课主要讲解了Java多线程编程的基础知识,包括线程的概念、线程与进程的区别、多线程的随机性、Java程序的进程中的线程、线程的创建方式、线程的执行流程、线程内存图等。 1. 进程与...

    day14_多线程01.zip

    本资源“day14_多线程01.zip”可能是某个教学课程或者学习资料的一部分,着重讲解了多线程的基础知识和应用。虽然没有具体的标签提供额外信息,但我们可以根据标题和描述来深入探讨多线程这一主题。 多线程是指在一...

    day15_多线程02.zip

    "day15_多线程02"这个标题暗示我们将会深入探讨多线程的第二部分,这可能是一个课程或者教程的第十五天内容,重点在于多线程的进阶主题。尽管没有具体的标签,我们可以假设这个压缩包可能包含了源代码、笔记、示例或...

    day11-多线程 java

    day11-多线程 java

    day13_StringBuffer_java_

    在Java编程语言中,"StringBuffer" 是一个非常重要的类,尤其在处理字符串操作时,尤其是在多线程环境中。在本教程"day13_StringBuffer_java_"中,我们将深入探讨这个类及其在Java中的作用。 Java是C++的优化版本,...

    GSDN_day_01.pdf

    Java的特点包括面向对象、简单性、解释性、高性能、分布式处理、多线程、健壮性、动态、结构中立和安全性等。 Java的简单性体现在它语法上的简洁,对于程序设计来说较为直观易学。解释性指的是Java程序在执行前需要...

    头歌java多线程基础-day10.rar

    头歌java多线程基础-day10.rar

    头歌java多线程基础-day11.rar

    头歌java多线程基础-day11.rar

    头歌java多线程基础-day12.rar

    头歌java多线程基础-day12.rar

    传智博客_Java培训_毕向东_Java基础课件

    4. **多线程**(传智播客_Java培训_毕向东_Java基础[05-多线程].pdf):Java提供了强大的并发支持,多线程编程是其特色之一。这里会涉及线程的创建、同步、协作以及线程安全问题的处理。 5. **集合**(传智播客_...

    多线程-day02.docx

    在“多线程-day02”的学习资源中,我们深入探讨了Java内存模型以及多线程的特性与控制机制。 **Java内存模型** Java内存模型,也称为JVM内存模型,是Java程序员理解和掌握的基础知识,特别是在进行并发编程时。它...

    多线程,day2,B站狂神,代码Lesson.rar

    "多线程,day2,B站狂神,代码Lesson.rar"这个资源可能是一个关于Java多线程的第二日课程,由B站(哔哩哔哩)上的一位知名编程讲师,也就是所谓的“狂神”,分享的教学材料,包含有实际的代码示例。 首先,我们来...

    java多线程代码笔记

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在Java中,实现多线程有两种主要方式:通过实现`Runnable`接口和继承`Thread`类。 首先,让我们从创建线程开始。当...

    JavaSE基础入门视频教程33天之(26) part2

    接着,“day26_21(多线程)JDK5实现线程池.avi”将介绍Java 5及更高版本引入的线程池概念。线程池可以优化系统资源的使用,通过复用已创建的线程来减少创建和销毁线程的开销。Executor框架中的ThreadPoolExecutor是...

    day24-多线程-设计模式.7z

    在本课程"day24-多线程-设计模式"中,我们将深入探讨如何利用多线程结合设计模式来优化程序执行效率。首先,我们要理解的是,多线程是指在一个进程中同时执行多个线程,从而使得程序能够同时处理多个任务,提升系统...

    day13_tomcat_java_

    总的来说,Java Web开发中,Tomcat的学习涵盖了服务器的安装、应用部署、Servlet与JSP编程、错误处理以及性能优化等多个方面。通过深入理解和实践,你将能够熟练地利用Tomcat搭建和管理Java Web应用。

    Wiley_Java in 60 Minutes a Day_2003

    8. **多线程**:学习如何创建和管理线程,理解同步和互斥的概念,以及如何避免线程安全问题。 9. **文件和目录操作**:了解如何在Java中进行文件和目录的创建、删除、重命名等操作。 10. **Java API的使用**:书中...

    coreJava_day2

    Core Java是Java编程的核心部分,包括面向对象编程、类库、集合框架、输入输出流、多线程、网络编程等方面。在"day2"的学习中,通常会涵盖一些基础但至关重要的概念,比如类与对象的创建、继承、封装、多态等面向...

Global site tag (gtag.js) - Google Analytics