`

线程的状态

阅读更多

1.线程共有下面4种状态:

a.       new(新建):当你用new创建一个线程时,该线程尚未运行。

b.       runnable(可运行):一旦调用了start方法,该线程便是一个可运行的线程。可运行的线程可以尚未执行,也可以正在执行,取决于线程调度的结果。(JAVA文档并不将正在运行的情况视为一个专门的状态)

c.       blocked(被中断运行):当出现下列操作之一时,线程便进入中断状态:

     a)         有人调用该线程的sleep方法

     b)        该线程调用了wait方法

     c)        该线程调用了一个在输入输出时中断的操作,也就是说,在输入和输出操作完成之前,该操作不会返回到它的调用程序

     d)        该线程试图锁定一个当前被另一个线程锁定了的对象

d.       dead(死亡):由于下面两个原因,线程将变成死线程:

     a)         由于run方法的正常退出而自然死亡

     b)        没有捕获到的异常事件终止了run方法的执行,从而导致线程突然死亡

 

2.一旦线程开始运行,它不必始终保持运行状态。实际上,正在运行的线程有时需要被中断,这样其它线程就有机会可以运行了

 

3.若要确定某个线程当前是否活着(也就是说确定它是否处于可运行状态或者被中断状态),可以使用isAlive方法。如果该线程是可运行线程或者被中断线程,那么该方法返回true;如果该线程仍然是个新建线程,或者该线程是个死线程,那么该方法返回false

 

4.注意:你无法确定一个活线程究竟是处于可运行状态还是被中断状态,也无法确定一个可运行线程是否正处在运行之中。另外,你也无法对尚未成为可运行的线程与已经死掉的线程进行区分。

 

5.线程必须退出中断状态,并且返回到可运行状态,方法是使用与进入中断状态相反的过程:

a.如果线程已经处于睡眠状态,就必须经过规定的毫秒数

b.如果线程正在等待输入或输出操作完成,那么必须等待该操作完成

c.如果线程调用了wait方法,那么另外一个线程必须调用notifyAll或者notify方法

d.如果线程正在等待另一个线程拥有的对象锁,那么另一个线程必须放弃该锁的所有权

 

6.线程状态图

 

 

 

a.线程状态转换实例:

 

package com.bijian.study;

public class ThreadStateDemo extends Thread {

    Thread t;

    public ThreadStateDemo() {
       t = new Thread(this);
       System.out.println("线程t为新建");
       t.start();
    }

    publicvoid run() {

       try {
           System.out.println("线程t在运行!");
           Thread.sleep(5000);  //静态方法,使当前正在执行的线程睡眠5秒
         System.out.println("线程t在短时间睡眠后重新运行!");
       }catch(InterruptedException e) {
           System.out.println("线程被中断");
       }
    }

    publicstaticvoid main(String[] args) {
       new ThreadStateDemo();
       System.out.println("主线程main结束!");
    }
}

 运行结果:

线程t为新建
主线程main结束!
线程t在运行!
线程t在短时间睡眠后重新运行!

  

b.终止线程实例:

 

package com.bijian.study;

public class ThreadShutDownDemo {

	public static void main(String args[]) {
		Runner r = new Runner();
		Thread t = new Thread(r);
		t.start();
		for(int i=0;i<10;i++) {
			if(i%10!=0) {
				System.out.println("在主线程中,i=" + i);
			}
		}
		System.out.println("主线程main结束");
		r.shutDown();//通知线程结束
	}
}

class Runner implements Runnable {
	
	private boolean flag = true;//控制线程是否结束
	
	public void run() {
		int i=0;
		while(flag == true) {
			System.out.println("在子线程中,i=" + i++);
		}
		System.out.println("子线程结束");
	}
	
	public void shutDown() {//设置线程结束标志
		flag = false;
	}
}

  

运行结果:

在主线程中,i=1
在子线程中,i=0
在主线程中,i=2
在子线程中,i=1
在主线程中,i=3
在子线程中,i=2
在主线程中,i=4
在子线程中,i=3
在子线程中,i=4
在子线程中,i=5
在主线程中,i=5
在主线程中,i=6
在主线程中,i=7
在主线程中,i=8
在子线程中,i=6
在主线程中,i=9
在子线程中,i=7
在子线程中,i=8
主线程main结束
在子线程中,i=9
子线程结束

 

 

c.join方法使用实例:

package com.bijian.study;

public class TheadJoinDemo {

	public static void main(String[] args) {
		Runner2 r = new Runner2();
		Thread t = new Thread(r);
		t.start();
		try {
			t.join();//主线程main将中断,直到线程t执行完毕
		}catch(InterruptedException e) {
		}
		for(int i=0;i<10;i++) {
			System.out.println("主线程:" + i);
		}
	}
}

class Runner2 implements Runnable {
	public void run() {
		for(int i=0;i<10;i++) {
			System.out.println("SubThread:" + i);
		}
	}
}

 

运行结果:
SubThread:0
SubThread:1
SubThread:2
SubThread:3
SubThread:4
SubThread:5
SubThread:6
SubThread:7
SubThread:8
SubThread:9
主线程:0
主线程:1
主线程:2
主线程:3
主线程:4
主线程:5
主线程:6
主线程:7
主线程:8
主线程:9

 

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

相关推荐

    delphi判断线程状态

    1. **线程状态** Delphi中的线程状态主要有以下几个: - **创建(Created)**:线程被创建但尚未开始执行。 - **就绪(Ready)**:线程已分配到CPU资源,等待执行。 - **运行(Running)**:线程正在执行。 - *...

    MFC的状态 模块状态、进程状态、线程状态。

    ### MFC的状态模块状态、进程状态、线程状态详解 #### 9.1 模块状态 MFC中的模块状态是指一个可执行程序或使用MFCDLL的动态链接库(DLL)的状态信息。例如,一个OLE控件可以视为一个模块。每个应用程序的模块都有...

    设计滚动字演示线程状态及改变方法

    这个主题“设计滚动字演示线程状态及改变方法”主要涵盖了如何利用Java的多线程特性来实现滚动文字效果,并且管理线程的状态变化。下面我们将详细探讨相关的知识点。 1. **线程基础**: - **线程与进程**:在...

    java线程状态转换图

    Java 线程状态转换图 Java 线程状态转换图是 Java 编程中非常重要的一个概念,它描述了线程在不同的状态之间的转换关系。了解线程状态转换图对 Java 编程的理解和应用非常重要。本文将详细介绍 Java 线程状态转换图...

    Java线程:线程状态的转换

    ### Java线程:线程状态的转换 #### 一、线程状态及其转换 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程中的多个线程共享同一份内存空间,使得线程间的通信...

    NtQuerySystemInformation判断线程是否被挂起/判断线程状态

    对于判断线程状态,我们需要设置为`SystemThreadInformation`,这样返回的数据将包含所有系统线程的信息。 当`SystemInformationClass`设置为`SystemThreadInformation`时,`NtQuerySystemInformation`会返回一个`...

    MFC属于模块-线程状态的部分.DOC

    在MFC中,模块状态、进程状态和线程状态是理解MFC应用程序运行机制的关键概念。 模块状态指的是一个可执行程序或使用MFC的DLL的状态。对于一个应用程序来说,每个模块都有自己的状态,包含了如资源加载的实例句柄、...

    Java线程状态流转图

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

    线程状态图

    标题和描述中提到的知识点是关于线程状态及其在计算机科学中的作用,特别是在Java编程语言中的应用。线程,作为进程中的独立控制流,是现代操作系统(如Mac、Windows NT、Windows 95等)和Java平台的核心概念之一。...

    vc中获取一个线程的状态及返回值

    - 可以使用`GetThreadContext()`,`GetThreadTimes()`,或`QueryThreadCycleTime()`等API查询线程状态。 4. **线程同步**: - 为了确保线程安全,通常需要使用同步机制,如互斥量(`Mutex`)、信号量(`Semaphore...

    JVM线程状态和Thread.sleep的实现原理探究.pdf

    在探究JVM线程状态以及Thread.sleep的实现原理时,我们首先需要了解Java线程与操作系统线程之间的关系。在Java虚拟机(JVM)中,每个线程通常都是以一对一的关系映射到操作系统线程上的。然而,尽管两者在实现上是...

    java线程状态图

    java线程从新建到死亡所能经历的各种状态之间的流转。包括运行到阻塞、进入锁池、等待队列,全面而清晰的一张图

    Java线程状态转换.pdf

    Java线程状态转换是Java多线程编程中的关键概念,对于理解和优化并发程序至关重要。Java线程在其生命周期中经历多种状态,这些状态之间的转换是由线程调度器根据特定的策略来决定的。以下是对Java线程状态转换的详细...

    c++调用PYthon线程状态

    ### C++ 调用 Python API 的线程状态与全局解释器锁(GIL) #### 一、背景介绍 在探讨C++如何调用Python时,我们首先需要理解Python的线程安全机制。Python解释器并非完全线程安全的,这意味着在多线程环境下访问...

    Java线程:线程状态的转换.pdf

    在Java编程中,线程是并发执行任务的基本单位,理解线程状态的转换对于编写高效的多线程程序至关重要。Java线程的状态主要包括以下五种: 1. 新状态(New):当通过`new Thread()`创建了一个线程对象,但还未调用`...

    winform 线程状态源码

    在Windows Forms(Winform)开发中,线程状态管理是一项重要的技术。线程是操作系统分配CPU时间的基本单元,用于执行程序中的并发任务。Winform应用程序通常由主线程(UI线程)驱动,处理用户界面交互,但有时我们...

    检测线程状态

    在多线程编程中,了解线程状态是至关重要的,因为这可以帮助我们诊断问题、优化性能并确保程序的正确运行。线程状态是线程在生命周期中的不同阶段,每个阶段都对应着特定的行为和资源使用情况。下面我们将深入探讨...

    Java线程:线程状态的转换[参考].pdf

    线程状态转换是一个复杂的过程,涉及到线程调度、锁的管理等多个方面。了解这些状态和转换机制,有助于编写高效、可控的多线程程序。在实际编程中,应根据需求合理利用这些状态控制,确保线程间的协作和资源利用达到...

Global site tag (gtag.js) - Google Analytics