Thread的start和run
1) start:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2) run:
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
— 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异常。
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验证字符串中是否包含数字,对数字的操作
2016-03-15 11:01 9538在javascript中有一个方法 ... -
jdk7 Collections.sort()方法报非法参数异常
2016-03-03 18:57 12104JDK7的Comparison method violates ... -
log4j.properties配置详解
2016-01-18 16:50 1324Log4J的配置文件(Configuration File)就 ... -
Java 日期时间 Date类型,long类型,String类型表现形式的转换
2015-12-24 17:35 3313Java 日期时间 Date类型,long类型,String类 ... -
Java多线程-工具篇-BlockingQueue
2015-11-24 16:13 1013Java多线程-工具篇-Block ... -
Java 实例 - 队列(Queue)入门用法
2015-11-23 17:27 2032队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表 ... -
Java中序列化的serialVersionUID作用
2015-11-13 14:13 4878Java序列化是将一个对象 ... -
java的序列化和反序列化
2015-10-27 19:48 1148Java基础学习总结——Jav ... -
java中volatile关键字的含义
2015-08-12 20:10 787java中volatile关键字的含 ... -
Java读写文件中文乱码问题
2015-07-20 17:49 3003问题:在用Java程序进行读写含中文的txt文件时,经常会出现 ... -
String类中split方法的使用
2015-07-02 14:39 1026String类中split方法的使用 split 方法:将一个 ... -
PreparedStatement防止SQL注入
2015-04-11 16:27 2835一条效率差的sql语句,足以毁掉整个应用. Stateme ... -
Session的生命周期
2015-04-11 11:58 961我们已经知道,Session是在用户第一次访问网 ... -
JAVA多线程和并发基础
2015-04-11 11:58 803JAVA多线程和并发基础 ... -
Java中equals()与hashCode()方法详解
2015-04-08 16:19 920一.equals()方法详解 equals()方法在o ... -
json数据后台处理
2015-03-30 16:05 832JAVA解析JSON问题,怎么解析,急!! String j ... -
java判断list为空
2015-01-30 15:25 4006java判断list为空 if(null == list | ... -
httpclient使用实践
2015-01-09 17:09 1381httpclient是什么这里不再详述(可参考最下方网址);直 ... -
java反射获取属性和方法
2015-01-09 11:12 3141反射的应用一般是要用到某些特殊类的属性和方法,无论是一般方法还 ... -
java中int 转String位数不够前面补零
2015-01-08 21:53 20029java 中int 转String位数不够前面补零 Stri ...
相关推荐
Java提供了ExecutorService和ThreadPoolExecutor类来管理线程,创建线程池可以有效控制并发线程的数量,减少线程的创建和销毁开销。线程池的基本使用如下: ```java ExecutorService executor = Executors....
Java线程有10个优先级,从`MIN_PRIORITY`(1)到`MAX_PRIORITY`(10),默认是`NORM_PRIORITY`(5)。优先级高的线程更可能被调度执行,但不保证。 4. **线程同步** 当多个线程访问共享资源时,可能会出现竞态条件,...
三、线程状态与生命周期 1. 新建(New):线程被创建但尚未启动。 2. 可运行(Runnable):线程已启动,正在竞争CPU执行权。 3. 运行(Running):线程获得CPU资源,正在执行run()方法。 4. 阻塞(Blocked):线程因...
Java 5及以上版本引入了ExecutorService和ThreadPoolExecutor,它们可以帮助我们管理线程池,有效地复用线程,减少系统开销。在小球运动模拟中,可能使用线程池来管理多个小球的线程,避免了频繁创建和销毁线程。 ...
### Java线程:线程状态的转换 #### 一、线程状态及其转换 ...通过以上分析,我们可以看到Java线程状态转换的基本原理以及如何利用线程状态来控制线程的行为,这对于开发高性能、高可靠性的并发程序至关重要。
这个"Java线程通信示例源代码"很可能包含了演示如何在不同线程之间共享数据和协调执行顺序的实例。线程通信主要涉及两个核心概念:同步和互斥。 1. **线程同步**:线程同步是为了防止多个线程同时访问共享资源,...
这个主题“设计滚动字演示线程状态及改变方法”主要涵盖了如何利用Java的多线程特性来实现滚动文字效果,并且管理线程的状态变化。下面我们将详细探讨相关的知识点。 1. **线程基础**: - **线程与进程**:在...
Java线程状态转换是Java多线程编程中的关键概念,对于理解和优化并发程序至关重要。Java线程在其生命周期中经历多种状态,这些状态之间的转换是由线程调度器根据特定的策略来决定的。以下是对Java线程状态转换的详细...
在分析Java应用程序的性能问题时,了解和分析Java线程的状态是非常关键的。线程堆栈信息可以让我们深入观察到线程的运行状况,包括线程的当前状态、调用堆栈、锁信息等。为了获取这些信息,我们可以使用jstack工具,...
Java的Thread类提供了start()来启动线程,interrupt()来中断线程,但需要注意的是,中断并不一定能立即停止线程,线程需要自行检查并响应中断状态。 另外,可能还会涉及到死锁、活锁和饥饿等并发问题,这些都是多...
下面是一个简单的示例,展示如何查看线程状态: ```java import java.util.concurrent.TimeUnit; public class CheckThreadState { public static void main(String[] args) { Thread thread = new Thread(() ->...
Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而...在"线程池.rar"和"线程实例"这两个文件中,你可以找到关于这些概念的具体示例代码,通过学习和实践,可以深入理解Java线程的运用和管理。
本资源"JAVA线程学习(源代码)"提供了关于Java线程的源代码示例,帮助我们深入理解和实践线程的使用。 首先,我们要理解Java中的线程模型。Java线程由`java.lang.Thread`类或`java.util.concurrent.Executor`框架来...
Java线程同步与通信是多线程编程中的关键概念,用于解决并发访问共享资源时可能出现的数据不一致性和竞态条件问题。以下将详细介绍这两个主题,以及如何通过代码示例进行演示。 1. **线程同步**: 线程同步是确保...
Java线程有五种状态:新建、运行、阻塞、等待/时间等待和终止。理解这些状态对于调试和优化多线程程序至关重要。 六、线程优先级 Java允许为线程设置优先级,但实际效果取决于操作系统的调度策略。优先级范围是1...
java线程死锁代码示例 本文主要介绍了java线程死锁代码示例,分享了一个简单线程死锁的例子,需要的朋友可以参考下。以下是对该示例的详细解释和知识点总结: 1. 死锁的概念:死锁是操作系统层面的一个错误,是...
在Java编程语言中,线程是程序执行的基本单元,它允许程序并发地...同时,"Java线程学习和总结.files"目录下的文件可能是与文章相关的辅助资料,例如代码示例或图片。建议结合这些资料一起学习,以获得更全面的知识。
本示例"简单的Java线程demo"旨在帮助初学者理解如何在Java中创建和管理线程。 在Java中,有两种主要的方式来创建线程:继承Thread类和实现Runnable接口。下面我们将详细讨论这两个方法。 1. 继承Thread类: 当一个...
### Java线程培训资料知识点详解 #### 一、Java线程基本概念 1. **如何编写与启动线程** - **方式一:继承Thread类** ```java class MyThread extends Thread { @Override public void run() { // 业务逻辑 ...
3. **改善用户体验**:多线程可以确保用户界面始终处于响应状态,即使后台正在进行一些耗时的操作。 #### synchronized关键字详解 `synchronized`是Java中用于实现线程同步的关键字之一。它可以用来修饰方法或者...