1.isAlive()
线程已经调用了start方法且没有结束
返回true时,线程对应于Runnable,Waiting,Timed_Waiting,Blocked四种State,不要以为 只是对应于Runnable状态
返回false时,线程对应于New,Terminated两种状态
2.isInterrupted()
线程是否interrupted status 是否为true,注意interrupted为true只是表明该线程的interrupt方法被调用了,该方法只是把interrupted状态设为true,建议线程终止,并不具有强制结束线程的功能,线程结束与否要看线程的run中对该状态为true时如何响应.如下的代码演示了线程当该状态变为true时退出运行.当然,线程可以忽略该状态.所以依靠interrupt方法来终止线程是不可行的.
当处于interrupted状态的线程调用sleep,join,wait方法时会抛出 InterruptedException 异常,而且该状态会被重置为false
//被interrupt后终止线程
3.
interrupt
该方法只会对alive的线程起作用,而且具体的行为根据线程所处的状态会有所不同
a.如果线程正在因为调用了wait,sleep,join(包括有时间参数的版本)方法处于阻塞状态,该方法会导致线程(不是interrupt方法)抛出InterruptedException异常,而且interrupt status会被设置为false(等于没调用)
b.如果线程处于NIO的InterruptibleChannel或者Selector的阻塞状态,则interrupt status会被设置为true,前者会抛出一个异常,后者会返回一个非零值
c.其余所有情况下的对该方法调用都会设置interrupt status为true
interrupt()方法被调用了,该方法只是把interrupted状态设为true,建议线程终止,并不具有强制结束线程的功能,线程结束与否要看线程的run中对该状态为true时如何响应
看代码对情况a的说明:
4.join
t.join();
t.join(1000);
调用该方法后,当前线程会阻塞直到线程t结束或者等待指定时间.但当前线程被interrupt(调用join前或者后)会抛出InterruptedException异常
该方法可以用于等待若干个线程执行完毕后再进行后续动作
5.setDaemon
设置线程为守护线程或者用户线程,必须在线程调用start前设置.
当只剩下守护线程时,JVM可以exit
(Java Virtual Machine exits when the only threads running are all
* daemon threads. )
6.yield
Thread.yield(),
当前线程进入Runnable状态,不会释放锁,这就造成当前线程可能在调用yield会马上重新获得执行权.经过测试低优先级的线程也会获得执行权这与网上说法不一致,猜测为多核所致.
7.sleep
Thread.sleep(time); 当前线程会休息指定的时间段,进入Time_Waiting状态,不会释放锁.
8.interrupted
Thread.interrupted() 当前线程的是否interrupted 状态为true.并且该方法会清空该状态.
Yield和Sleep的异同
1) sleep()使当前线程进入Time_Waiting状态,所以执行sleep()的线程在指定的时间内肯定不会执行;yield()只是使当前线程重新回到Runnable状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
2) sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使优先级大于等于它的线程有执行的机会。,蓝色字体内容待商榷
线程已经调用了start方法且没有结束
返回true时,线程对应于Runnable,Waiting,Timed_Waiting,Blocked四种State,不要以为 只是对应于Runnable状态
返回false时,线程对应于New,Terminated两种状态
2.isInterrupted()
线程是否interrupted status 是否为true,注意interrupted为true只是表明该线程的interrupt方法被调用了,该方法只是把interrupted状态设为true,建议线程终止,并不具有强制结束线程的功能,线程结束与否要看线程的run中对该状态为true时如何响应.如下的代码演示了线程当该状态变为true时退出运行.当然,线程可以忽略该状态.所以依靠interrupt方法来终止线程是不可行的.
当处于interrupted状态的线程调用sleep,join,wait方法时会抛出 InterruptedException 异常,而且该状态会被重置为false
//被interrupt后终止线程
- public void run() {
- while(!isInterrupted()){
- //do task
- }
- }
- public void run() {
- while(true){
- //不管着怎样,线程只管执行,注意interrupt会导致阻塞(wait,sleep,join)的线程抛出异常,代码要根据业务逻辑争取处理异常(忽略异常或终止等)
- //do task
- }
- }
3.
interrupt
该方法只会对alive的线程起作用,而且具体的行为根据线程所处的状态会有所不同
a.如果线程正在因为调用了wait,sleep,join(包括有时间参数的版本)方法处于阻塞状态,该方法会导致线程(不是interrupt方法)抛出InterruptedException异常,而且interrupt status会被设置为false(等于没调用)
b.如果线程处于NIO的InterruptibleChannel或者Selector的阻塞状态,则interrupt status会被设置为true,前者会抛出一个异常,后者会返回一个非零值
c.其余所有情况下的对该方法调用都会设置interrupt status为true
interrupt()方法被调用了,该方法只是把interrupted状态设为true,建议线程终止,并不具有强制结束线程的功能,线程结束与否要看线程的run中对该状态为true时如何响应
看代码对情况a的说明:
- import java.util.Random;
- public class TestThreadStatus {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Thread t = new TestThread();
- try {
- t.start();
- try {
- while(true){
- try {
- Thread.sleep(5000);
- t.interrupt();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- class TestThread extends Thread {
- public void run() {
- try {
- while (true) {
- try {
- // 为true,所以下列三个方法的调用(当thread已经被interrupt或者稍后被interrupt)都会抛出
- //InterruptedException
- System.err.println("Thread is interrupted = "+this.isInterrupted());
- int random = (int)(new Random().nextDouble()*3);
- //当线程调3个方法任意一个都会导致异常,并清空interrupted
- if(random == 0){
- System.err.println("Interrupt a thread blocked by wait()");
- synchronized("lock"){
- "lock".wait(); //说明wait除了被notify之外,还有可能被interrupt释放
- }
- } else if(random == 1){
- System.err.println("Interrupt a thread blocked by sleep()");
- Thread.sleep(20000);
- } else {
- System.err.println("Interrupt a thread blocked by join()");
- Thread tt = new OneThread();
- tt.start();//一定要启动,下一行的join才会阻塞
- tt.join();//等待线程tt die,如果tt线程状态为new或者terminated(alive=false),都会马上返回
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- System.err.println("Thread is interrupted = "+this.isInterrupted());// 为false,因为已经被清空
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- class OneThread extends Thread {
- public void run() {
- try {
- while (true) {
- try {
- Thread.sleep(5000);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
4.join
t.join();
t.join(1000);
调用该方法后,当前线程会阻塞直到线程t结束或者等待指定时间.但当前线程被interrupt(调用join前或者后)会抛出InterruptedException异常
该方法可以用于等待若干个线程执行完毕后再进行后续动作
5.setDaemon
设置线程为守护线程或者用户线程,必须在线程调用start前设置.
当只剩下守护线程时,JVM可以exit
(Java Virtual Machine exits when the only threads running are all
* daemon threads. )
6.yield
Thread.yield(),
当前线程进入Runnable状态,不会释放锁,这就造成当前线程可能在调用yield会马上重新获得执行权.经过测试低优先级的线程也会获得执行权这与网上说法不一致,猜测为多核所致.
7.sleep
Thread.sleep(time); 当前线程会休息指定的时间段,进入Time_Waiting状态,不会释放锁.
8.interrupted
Thread.interrupted() 当前线程的是否interrupted 状态为true.并且该方法会清空该状态.
Yield和Sleep的异同
1) sleep()使当前线程进入Time_Waiting状态,所以执行sleep()的线程在指定的时间内肯定不会执行;yield()只是使当前线程重新回到Runnable状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
2) sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使优先级大于等于它的线程有执行的机会。,蓝色字体内容待商榷
相关推荐
其中,`Thread.IsAlive`属性是一个非常重要的成员,它允许开发者检查线程的当前状态,以确定线程是否已经启动并且仍在运行。在理解`Thread.IsAlive`属性的用法之前,我们需要先了解一些基本的线程概念。 1. **线程...
Java Thread之Sleep()使用方法总结 Java Thread之Sleep()使用方法总结是Java多线程编程中的一种常见方法,用于使当前线程休眠,进入阻塞状态,暂停执行。这个方法非常重要,因为它可以帮助开发者控制线程的执行顺序...
C++中的thread类是C++11标准引入的,用于在C++程序中...合理地使用这些机制是多线程编程中的重要部分。 总之,std::thread为C++提供了强大的多线程支持,使得开发者可以方便地创建和管理线程,实现复杂的应用逻辑。
总结,"RealThread.RT-Thread.3.1.5.zip"是RT-Thread针对Keil MDK环境的一个打包文件,它使得开发者能够轻松地在Keil MDK中集成和使用RT-Thread。了解并掌握RT-Thread的使用,对于提升嵌入式开发效率、优化物联网...
本文将深入探讨五个关键的ASP.NET AJAX控件,并总结它们的常用方法。 1. ScriptManager控件: ScriptManager是ASP.NET AJAX的核心组件,它负责引入必要的JavaScript库,如MicrosoftAjax.js和MicrosoftAjax.debug.js...
总结,本主题涵盖了线程创建、等待、清除的核心概念,以及线程ID、属性、同步和异常处理等相关知识。这些内容对于理解和实现高效的多线程程序至关重要,尤其在需要并发处理大量任务的系统中。通过学习和实践,开发者...
总结一下,这个资源涵盖了以下几个关键知识点: 1. RT-thread操作系统与GD32F450 MCU的结合使用。 2. 独立看门狗(IWDG)的概念、功能及其在嵌入式系统中的重要性。 3. 如何编写和使用IWDG的底层驱动代码。 4. 在RT-...
总结来说,通过`Thread`类,我们可以创建和管理多线程,实现并发执行任务,提升程序性能。在Windows应用开发中,理解和熟练运用多线程技巧是至关重要的,它不仅可以提高用户体验,还能充分利用多核处理器的计算能力...
### 关于Thread.Sleep(0)的深入解析 在.NET框架中,`Thread.Sleep(0)`是一种特殊的线程操作方法,其行为与预期的含义存在一定的差异...正确理解和应用`Thread.Sleep(0)`对于开发高效、稳定的多线程应用程序至关重要。
总结来说,"5956479threadx.rar" 包含的ThreadX参考源代码是一个宝贵的教育资源,它可以帮助嵌入式工程师深入理解RTOS的工作机制,学习如何有效地利用ThreadX的功能来构建高效、可靠的嵌入式系统。通过阅读源代码、...
Handler、Thread和Looper之间的关系可以总结为:Handler是用来发送和处理消息的,它必须与一个Looper关联;Thread是消息处理的上下文,每个Thread可以有一个Looper;Looper则是在Thread中运行的消息循环,负责调度和...
因此,理解如何在Thread中捕获并处理异常是非常重要的。 首先,我们来看一下Java中异常的基本概念。在Java中,异常是通过`try-catch`块来处理的。当在`try`块中发生异常时,控制流会立即跳转到相应的`catch`块,...
2. **指南约定**:文档中使用特定格式标记重要信息,例如警告、注意事项等。 #### 十一、总结 **ThreadX** 作为一款高性能的嵌入式实时操作系统,具有出色的性能、可靠性和安全性。它不仅支持多种安全认证标准,还...
### 总结 在C#中,线程同步机制非常重要,能够帮助开发者有效地管理多线程环境下的资源共享问题。通过合理使用`Interlocked`类、`Monitor`类和`WaitHandle`类等工具,可以显著提高应用程序的稳定性和性能。理解这些...
- 展示了如何在C#中定义Web方法,并利用`System.Threading.Thread.Sleep`模拟耗时操作。 6. **客户端JavaScript实现** - 提供了客户端如何调用服务器端方法的示例,包括如何传递参数以及如何处理返回的结果。 - ...
二、threadsample官方例子的重要性 "threadsample"是官方推荐的学习多线程编程的实例,它包含了一系列精心设计的示例,覆盖了线程创建、同步、通信等关键主题。由于其在“train”平台上的不可用性,以及其他资源...
总结来说,STM32 Bootloader的实现涉及到硬件初始化、固件更新和安全机制,而RT-Thread的移植则需要考虑RTOS的配置、中断服务、外设驱动和内存管理。结合这两者,可以构建一个功能强大且稳定的嵌入式系统,特别是当...
总结来说,C#的多线程功能强大,通过`Thread`类、锁机制、线程同步原语以及异步编程模型,开发者可以有效地编写并发程序,充分利用硬件资源,提高软件性能。在实际开发中,理解并熟练运用这些概念和技术,对于编写...