`

Thread 重要方法总结

    博客分类:
  • java
阅读更多

Thread 重要方法总结

博客分类:
 
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后终止线程 
Java代码  收藏代码
  1. public void run() {  
  2.    while(!isInterrupted()){  
  3.        //do task  
  4.    }  
  5. }  


Java代码  收藏代码
  1.  public void run() {  
  2.     while(true){  
  3. //不管着怎样,线程只管执行,注意interrupt会导致阻塞(wait,sleep,join)的线程抛出异常,代码要根据业务逻辑争取处理异常(忽略异常或终止等)  
  4.         //do task  
  5.     }  
  6.  }  

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的说明: 

Java代码  收藏代码
  1. import java.util.Random;  
  2.   
  3. public class TestThreadStatus {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         Thread t = new TestThread();  
  10.        
  11.   
  12.         try {  
  13.   
  14.             t.start();  
  15.                
  16.             try {  
  17.                 while(true){  
  18.                     try {  
  19.                         Thread.sleep(5000);  
  20.                         t.interrupt();  
  21.                     } catch (InterruptedException e) {  
  22.                         e.printStackTrace();  
  23.                     }  
  24.                 }  
  25.             } catch (Exception e) {  
  26.                 e.printStackTrace();  
  27.             }  
  28.   
  29.         } catch (Exception e) {  
  30.             e.printStackTrace();  
  31.         }  
  32.   
  33.     }  
  34.   
  35. }  
  36.   
  37. class TestThread extends Thread {  
  38.     public void run() {  
  39.         try {  
  40.             while (true) {  
  41.                 try {  
  42.                     // 为true,所以下列三个方法的调用(当thread已经被interrupt或者稍后被interrupt)都会抛出  
  43.                     //InterruptedException  
  44.                      System.err.println("Thread is interrupted = "+this.isInterrupted());   
  45.                        
  46.                      int random = (int)(new Random().nextDouble()*3);  
  47.                        
  48.                     //当线程调3个方法任意一个都会导致异常,并清空interrupted  
  49.                      if(random == 0){  
  50.                          System.err.println("Interrupt a thread blocked by wait()");  
  51.                          synchronized("lock"){  
  52.                                "lock".wait(); //说明wait除了被notify之外,还有可能被interrupt释放  
  53.                          }  
  54.                      } else if(random == 1){  
  55.                          System.err.println("Interrupt a thread blocked by sleep()");  
  56.                          Thread.sleep(20000);   
  57.                      } else {  
  58.                          System.err.println("Interrupt a thread blocked by join()");  
  59.                          Thread tt = new OneThread();  
  60.                          tt.start();//一定要启动,下一行的join才会阻塞  
  61.                          tt.join();//等待线程tt die,如果tt线程状态为new或者terminated(alive=false),都会马上返回  
  62.                      }  
  63.                        
  64.   
  65.                 } catch (InterruptedException e) {  
  66.                     e.printStackTrace();  
  67.                     System.err.println("Thread is interrupted  = "+this.isInterrupted());// 为false,因为已经被清空  
  68.                 }  
  69.             }  
  70.         } catch (Exception e) {  
  71.             e.printStackTrace();  
  72.         }  
  73.     }  
  74. }  
  75.   
  76. class OneThread extends Thread {  
  77.     public void run() {  
  78.         try {  
  79.             while (true) {  
  80.                 try {  
  81.                     Thread.sleep(5000);  
  82.                 } catch (Exception e) {  
  83.                     e.printStackTrace();  
  84.                 }  
  85.             }  
  86.         } catch (Exception e) {  
  87.             e.printStackTrace();  
  88.         }  
  89.     }  
  90. }  



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()只能使优先级大于等于它的线程有执行的机会。,蓝色字体内容待商榷
分享到:
评论
1 楼 andyLee520 2013-07-05  

相关推荐

    C#多线程之Thread中Thread.IsAlive属性用法分析

    其中,`Thread.IsAlive`属性是一个非常重要的成员,它允许开发者检查线程的当前状态,以确定线程是否已经启动并且仍在运行。在理解`Thread.IsAlive`属性的用法之前,我们需要先了解一些基本的线程概念。 1. **线程...

    Java Thread之Sleep()使用方法总结

    Java Thread之Sleep()使用方法总结 Java Thread之Sleep()使用方法总结是Java多线程编程中的一种常见方法,用于使当前线程休眠,进入阻塞状态,暂停执行。这个方法非常重要,因为它可以帮助开发者控制线程的执行顺序...

    详解C++ thread用法总结

    C++中的thread类是C++11标准引入的,用于在C++程序中...合理地使用这些机制是多线程编程中的重要部分。 总之,std::thread为C++提供了强大的多线程支持,使得开发者可以方便地创建和管理线程,实现复杂的应用逻辑。

    RealThread.RT-Thread.3.1.5.zip

    总结,"RealThread.RT-Thread.3.1.5.zip"是RT-Thread针对Keil MDK环境的一个打包文件,它使得开发者能够轻松地在Keil MDK中集成和使用RT-Thread。了解并掌握RT-Thread的使用,对于提升嵌入式开发效率、优化物联网...

    ASP.NET中AJAX重要五控件之我的理解和常用方法的总结

    本文将深入探讨五个关键的ASP.NET AJAX控件,并总结它们的常用方法。 1. ScriptManager控件: ScriptManager是ASP.NET AJAX的核心组件,它负责引入必要的JavaScript库,如MicrosoftAjax.js和MicrosoftAjax.debug.js...

    线程创建,线程等待与清除,thread_clean.c,thread_create.c,thread_create.c,thread_exit_struct.c,thread_id.c,thread_int.c, thread_join.c, thread_join.c, thread_string.c, thread_struct.c

    总结,本主题涵盖了线程创建、等待、清除的核心概念,以及线程ID、属性、同步和异常处理等相关知识。这些内容对于理解和实现高效的多线程程序至关重要,尤其在需要并发处理大量任务的系统中。通过学习和实践,开发者...

    RT-thread+GD32F450+iwdg.zip

    总结一下,这个资源涵盖了以下几个关键知识点: 1. RT-thread操作系统与GD32F450 MCU的结合使用。 2. 独立看门狗(IWDG)的概念、功能及其在嵌入式系统中的重要性。 3. 如何编写和使用IWDG的底层驱动代码。 4. 在RT-...

    一个使用thread类的windows应用实例

    总结来说,通过`Thread`类,我们可以创建和管理多线程,实现并发执行任务,提升程序性能。在Windows应用开发中,理解和熟练运用多线程技巧是至关重要的,它不仅可以提高用户体验,还能充分利用多核处理器的计算能力...

    关于Thread.Sleep(0)的说明

    ### 关于Thread.Sleep(0)的深入解析 在.NET框架中,`Thread.Sleep(0)`是一种特殊的线程操作方法,其行为与预期的含义存在一定的差异...正确理解和应用`Thread.Sleep(0)`对于开发高效、稳定的多线程应用程序至关重要。

    THREADX的参考源程序5956479threadx.rar

    总结来说,"5956479threadx.rar" 包含的ThreadX参考源代码是一个宝贵的教育资源,它可以帮助嵌入式工程师深入理解RTOS的工作机制,学习如何有效地利用ThreadX的功能来构建高效、可靠的嵌入式系统。通过阅读源代码、...

    Handler + Thread + Looper

    Handler、Thread和Looper之间的关系可以总结为:Handler是用来发送和处理消息的,它必须与一个Looper关联;Thread是消息处理的上下文,每个Thread可以有一个Looper;Looper则是在Thread中运行的消息循环,负责调度和...

    Thread捕捉异常示例

    因此,理解如何在Thread中捕获并处理异常是非常重要的。 首先,我们来看一下Java中异常的基本概念。在Java中,异常是通过`try-catch`块来处理的。当在`try`块中发生异常时,控制流会立即跳转到相应的`catch`块,...

    threadX用户手册英文完整版

    2. **指南约定**:文档中使用特定格式标记重要信息,例如警告、注意事项等。 #### 十一、总结 **ThreadX** 作为一款高性能的嵌入式实时操作系统,具有出色的性能、可靠性和安全性。它不仅支持多种安全认证标准,还...

    c# 线程(thread)同步处理

    ### 总结 在C#中,线程同步机制非常重要,能够帮助开发者有效地管理多线程环境下的资源共享问题。通过合理使用`Interlocked`类、`Monitor`类和`WaitHandle`类等工具,可以显著提高应用程序的稳定性和性能。理解这些...

    js调用服务器端方法总结.pdf

    - 展示了如何在C#中定义Web方法,并利用`System.Threading.Thread.Sleep`模拟耗时操作。 6. **客户端JavaScript实现** - 提供了客户端如何调用服务器端方法的示例,包括如何传递参数以及如何处理返回的结果。 - ...

    threadsample官方例子

    二、threadsample官方例子的重要性 "threadsample"是官方推荐的学习多线程编程的实例,它包含了一系列精心设计的示例,覆盖了线程创建、同步、通信等关键主题。由于其在“train”平台上的不可用性,以及其他资源...

    stm32的bootloader及移植的rtthread

    总结来说,STM32 Bootloader的实现涉及到硬件初始化、固件更新和安全机制,而RT-Thread的移植则需要考虑RTOS的配置、中断服务、外设驱动和内存管理。结合这两者,可以构建一个功能强大且稳定的嵌入式系统,特别是当...

    C# (Thread)

    总结来说,C#的多线程功能强大,通过`Thread`类、锁机制、线程同步原语以及异步编程模型,开发者可以有效地编写并发程序,充分利用硬件资源,提高软件性能。在实际开发中,理解并熟练运用这些概念和技术,对于编写...

Global site tag (gtag.js) - Google Analytics