`

java线程状态及示例

    博客分类:
  • java
阅读更多
Thread的start和run
1) start:

用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

2) run:

run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
public class SMSSample implements Runnable {

	public static void main(String[] args) {
	new SMSSample().multiThreadSendMsg(); // 调用多线程进行测试
	}
}

	// 多线程发送短信测试
	public void multiThreadSendMsg() {
		int threadCount =150; //线程数压力测试变量
		Runnable target = new SMSSample();
		long start = System.currentTimeMillis();
		for (int i = 0; i < threadCount; i++) {

			Thread thread = new Thread(target);
			thread.setName("Thead-Call-SMSSample-"+i);
			System.out.println("---------线程的名字是:" + thread.getName());
			System.out.println("---------线程的ID是:" + thread.getId());
			thread.start();

		}
		}
		
	}


@Override
	public void run() {
	线程体context;
	try {
		while(canStart){  }
	}catch (Exception e) {
	e.p...
	}
	}

—      void notifyAll():唤醒在此对象上等待的所有线程
—  void wait():使线程陷入一直等待的状态,除非被唤醒。
—  void wait(long timeout):使线程等待timeout指定的毫秒数。当等待时间已满,或者被唤醒,线程将重新被线程调度器调度。如果timeout为0,则等同于wait()。
—  Thread.sleep():当处于运行状态的线程调用Thread类的sleep()方法之后,线程将在方法参数指定的时间段之内进入休眠状态,即在不释放任何运行资源的情况下停止运行。当休眠时间结束,或者捕获并响应由于Thread.interrupt()方法引起的 InterruptedException异常之后,线程回到运行状态。

---------------------------------------------------
线程的状态
可以将线程分为创建、就绪、运行、休眠、挂起和死亡等类型。在不同类型的线程状态下,线程的特征如下所示。
— 创建状态:当利用new关键字创建线程对象实例后,它仅仅作为一个对象实例存在,JVM没有为其分配CPU时间片等运行资源。
— 就绪状态:对处于创建状态的线程调用Thread类的start()方法将线程的状态转换为就绪状态。这时,线程已经得到除CPU时间片之外的其他系统资源,只等JVM的线程调度器按照线程的优先级对该线程进行调度,从而使该线程拥有能够获得CPU时间片的机会。
— 运行状态:JVM的线程调度器选中处于就绪状态的线程,使其获得CPU时间片。
— 休眠状态:在线程运行过程中可以调用Thread类的sleep()方法,并在方法参数中指定线程的休眠时间将线程状态转换为休眠状态。这时,该线程在指定的休眠时间内,在不释放占用资源的情况下停止运行。时间到达后,线程重新进入运行状态。处于休眠状态的线程,可能遇上 java.lang.InterruptedException异常,从而被迫停止休眠。
— 挂起状态:可以通过调用Thread类的suspend()方法将线程的状态转换为挂起状态。这时,线程将释放占用的所有资源,由JVM调度转入临时存储空间,直至应用程序调用Thread类的resume()方法恢复线程运行。
—      死亡状态:当线程体运行结束或者调用线程对象的Thread类的stop()方法后线程将终止运行,由JVM收回线程占用的资源。

—  Thread.yield():当处于运行状态的线程调用Thread类的yield()方法之后,线程所拥有的CPU时间片被剥夺,重新回到就绪状态,等候JVM线程调度器的调度。
—  Thread.sleep():当处于运行状态的线程调用Thread类的sleep()方法之后,线程将在方法参数指定的时间段之内进入休眠状态,即在不释放任何运行资源的情况下停止运行。当休眠时间结束,或者捕获并响应由于Thread.interrupt()方法引起的 InterruptedException异常之后,线程回到运行状态。
—  Object.wait():当处于运行状态的线程调用Object类的wait()方法之后,线程将方法参数指定的时间段之内、在保留运行状态的情况下回到就绪状态。Object类的wait()方法支持无参调用,表示一直停止运行,等待被Object.notify()方法唤醒。
—  Object.notify():如果线程不处于就绪(等待)状态,则调用Object类的notify()方法不起任何作用;否则线程将重新获得竞争CPU时间片的资格,从等待之前的状态点开始运行。
—  Thread.stop():终止线程,线程将释放占用的全部资源。该方法已被禁用。
—      Thread.join():结束线程,并等待方法参数指定的时间段。在等待期间,如果线程已经结束,则立刻返回。Thread.join()方法是推荐的结束线程的方法。
—     Thread.suspend()、Thread.resume()、Thread.stop()方法已被禁用,因此线程的状态实际上只有5种:创建、就绪、运行、休眠和死亡。

线程的等待和唤醒
使线程中断运行,返回就绪状态的手段是调用java.lang.Object对象的wait()方法;唤醒处于等待状态的线程的手段是调用java.lang.Object对象的notify()方法。对wait()和notify()方法说明如下。
—  void wait():使线程陷入一直等待的状态,除非被唤醒。
—  void wait(long timeout):使线程等待timeout指定的毫秒数。当等待时间已满,或者被唤醒,线程将重新被线程调度器调度。如果timeout为0,则等同于wait()。
—  void wait(long timeout,int nanos):使线程等待timeout指定的毫秒数+nanos指定的微秒数。当等待时间已满,或者被唤醒,线程将重新被线程调度器调度。如果timeout和nanos均为0,则等同于wait()。
—  void notify():唤醒在此对象上等待的一个线程,如果在此对象上有多个线程同时在等待,则任意唤醒其中一个。
—      void notifyAll():唤醒在此对象上等待的所有线程

线程的休眠和中断
线程的休眠状态和就绪(包括等待)状态的不同之处在于,处于休眠状态的线程并不释放运行资源,在休眠结束之后,不用等待被JVM线程调度器再度选中,而可以直接进入运行状态。结束休眠状态有两种途径:(1)休眠时间到达后,线程重新进入运行状态;(2)处于休眠状态的线程遇上java.lang.InterruptedException异常,从而被迫停止休眠。
使当前线程进入休眠状态的手段是调用Thread类的sleep()方法,该方法是静态方法,这意味着不用指定Thread对象便可以直接使用。打断某线程的休眠状态的手段是调用该线程对象的interrupt()方法。对 sleep()和interrupt()方法说明如下。
—  void sleep(long timeout):使当前线程休眠timeout指定的毫秒数。在休眠过程中,如果遇上中断,则抛出InterruptedException异常。
—  void sleep(long timeout,int nanos):使当前线程休眠timeout指定的毫秒数+nanos指定的微秒数。在休眠过程中,如果遇上中断,则抛出InterruptedException异常。
—      void interrupt():中断线程的休眠状态。

线程的终止
对于终止运行中的线程,Thread类原本提供了一个停止线程的方法:stop(),但是实践证明该方法具有固有的不安全性,因此已被弃用。结合目前我们已经掌握的技能,已经能够完美地终止线程,那便是利用线程的休眠和中断机制,在子线程中有意地为调度线程(比如创建线程的主线程)安排中断机会。
利用线程的休眠和中断机制,可以不留遗患地完美结束线程,是终止线程的推荐做法。例程虽然很简单,但是对于更复杂的场景,也可以遵照这个模型来设计线程的终止机制。
在和终止线程有关的方法中,Thread类还提供了一系列join()方法来等待线程结束。请注意,join()方法并不能终止某线程,而是提供了一个阻塞当前线程、等待某线程终止的途径。对join()方法说明如下。
—  void join():一直阻塞当前线程,等待线程结束。在等待过程中,如果遇上中断请求,则抛出InterruptedException异常。
—  void join(long timeout):在timeout指定的毫秒时间内阻塞当前线程,等待线程结束。在等待过程中,如果遇上中断请求,则抛出InterruptedException异常。
—  void join(long timeout, int nanos):在timeout指定的毫秒+nanos指定的微秒时间内阻塞当前线程,等待线程结束。在等待过程中,如果遇上中断请求,则抛出InterruptedException异常。
分享到:
评论

相关推荐

    Java多线程详解及示例

    Java提供了ExecutorService和ThreadPoolExecutor类来管理线程,创建线程池可以有效控制并发线程的数量,减少线程的创建和销毁开销。线程池的基本使用如下: ```java ExecutorService executor = Executors....

    java 多线程示例

    Java线程有10个优先级,从`MIN_PRIORITY`(1)到`MAX_PRIORITY`(10),默认是`NORM_PRIORITY`(5)。优先级高的线程更可能被调度执行,但不保证。 4. **线程同步** 当多个线程访问共享资源时,可能会出现竞态条件,...

    java多线程示例

    三、线程状态与生命周期 1. 新建(New):线程被创建但尚未启动。 2. 可运行(Runnable):线程已启动,正在竞争CPU执行权。 3. 运行(Running):线程获得CPU资源,正在执行run()方法。 4. 阻塞(Blocked):线程因...

    java多线程应用实现示例

    Java 5及以上版本引入了ExecutorService和ThreadPoolExecutor,它们可以帮助我们管理线程池,有效地复用线程,减少系统开销。在小球运动模拟中,可能使用线程池来管理多个小球的线程,避免了频繁创建和销毁线程。 ...

    Java线程:线程状态的转换

    ### Java线程:线程状态的转换 #### 一、线程状态及其转换 ...通过以上分析,我们可以看到Java线程状态转换的基本原理以及如何利用线程状态来控制线程的行为,这对于开发高性能、高可靠性的并发程序至关重要。

    Java 线程通信示例 源代码

    这个"Java线程通信示例源代码"很可能包含了演示如何在不同线程之间共享数据和协调执行顺序的实例。线程通信主要涉及两个核心概念:同步和互斥。 1. **线程同步**:线程同步是为了防止多个线程同时访问共享资源,...

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

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

    Java线程状态转换.pdf

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

    输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程

    在分析Java应用程序的性能问题时,了解和分析Java线程的状态是非常关键的。线程堆栈信息可以让我们深入观察到线程的运行状况,包括线程的当前状态、调用堆栈、锁信息等。为了获取这些信息,我们可以使用jstack工具,...

    java 多线程并发实例

    Java的Thread类提供了start()来启动线程,interrupt()来中断线程,但需要注意的是,中断并不一定能立即停止线程,线程需要自行检查并响应中断状态。 另外,可能还会涉及到死锁、活锁和饥饿等并发问题,这些都是多...

    Java源码查看线程的运行状态.rar

    下面是一个简单的示例,展示如何查看线程状态: ```java import java.util.concurrent.TimeUnit; public class CheckThreadState { public static void main(String[] args) { Thread thread = new Thread(() -&gt;...

    java线程实例 各种小Demo

    Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而...在"线程池.rar"和"线程实例"这两个文件中,你可以找到关于这些概念的具体示例代码,通过学习和实践,可以深入理解Java线程的运用和管理。

    JAVA线程学习(源代码)

    本资源"JAVA线程学习(源代码)"提供了关于Java线程的源代码示例,帮助我们深入理解和实践线程的使用。 首先,我们要理解Java中的线程模型。Java线程由`java.lang.Thread`类或`java.util.concurrent.Executor`框架来...

    java线程同步及通信

    Java线程同步与通信是多线程编程中的关键概念,用于解决并发访问共享资源时可能出现的数据不一致性和竞态条件问题。以下将详细介绍这两个主题,以及如何通过代码示例进行演示。 1. **线程同步**: 线程同步是确保...

    深入浅出java多线程代码示例

    Java线程有五种状态:新建、运行、阻塞、等待/时间等待和终止。理解这些状态对于调试和优化多线程程序至关重要。 六、线程优先级 Java允许为线程设置优先级,但实际效果取决于操作系统的调度策略。优先级范围是1...

    java线程死锁代码示例

    java线程死锁代码示例 本文主要介绍了java线程死锁代码示例,分享了一个简单线程死锁的例子,需要的朋友可以参考下。以下是对该示例的详细解释和知识点总结: 1. 死锁的概念:死锁是操作系统层面的一个错误,是...

    Java线程学习和总结

    在Java编程语言中,线程是程序执行的基本单元,它允许程序并发地...同时,"Java线程学习和总结.files"目录下的文件可能是与文章相关的辅助资料,例如代码示例或图片。建议结合这些资料一起学习,以获得更全面的知识。

    简单的java线程demo

    本示例"简单的Java线程demo"旨在帮助初学者理解如何在Java中创建和管理线程。 在Java中,有两种主要的方式来创建线程:继承Thread类和实现Runnable接口。下面我们将详细讨论这两个方法。 1. 继承Thread类: 当一个...

    Java线程培训资料

    ### Java线程培训资料知识点详解 #### 一、Java线程基本概念 1. **如何编写与启动线程** - **方式一:继承Thread类** ```java class MyThread extends Thread { @Override public void run() { // 业务逻辑 ...

    JAVA单线程多线程

    3. **改善用户体验**:多线程可以确保用户界面始终处于响应状态,即使后台正在进行一些耗时的操作。 #### synchronized关键字详解 `synchronized`是Java中用于实现线程同步的关键字之一。它可以用来修饰方法或者...

Global site tag (gtag.js) - Google Analytics