`

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  

相关推荐

    MATLAB绘制3D隐函数曲面的方法总结-MarchingCubes.zip

    MATLAB绘制3D隐函数曲面的方法总结-MarchingCubes.zip 本帖最后由 winner245 于 2013-10-28 00:45 编辑 背景介绍 Matlab提供了一系列绘图函数,常见的包括绘制2D曲线的plot函数、绘制2D隐函数曲线的ezplot函数...

    java 多线程设计模式 进程详解

    通过Thread类创建线程 使用Runable接口的线程 线程的生命周期 线程命名 访问线程 线程的启动、停止和连接 总结 第三章 同步技术 银行的例子 异步读取数据 一个进行同步操作的类 同步块 嵌套锁 死锁 返回到银行的...

    java 面试题 总结

    sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程...

    【RT-Thread作品秀】手语识别翻译发生装置-电路方案

    RT-Thread使用情况概述(简要总结下应用中RT-Thread使用情况:内核部分、组件部分、软件包部分、内核、其他)使用rt-thread的i2c驱动部分驱动多个MPU6050,然后通过uart驱动发送出去 ART-PI 硬件框架(概述应用所采用...

    java多线程设计模式详解(PDF及源码)

    单线程程序 多线程程序 Thread类的run方法和start方法 线程的启动 线程的启动(1)——利用Thread类的子类 线程的启动(2)——利用Runnable接口 线程的暂时停止 线程的共享互斥 synchronized方法 synchronized阻挡 ...

    java技能总结.docx

    掌握Java标准库:掌握Java标准库中的重要类和接口,如String、ArrayList、HashMap、Thread、Socket等。 掌握Java的高级特性:掌握Java的反射、泛型、注解、并发编程等高级特性,以及Java集合框架和并发包的使用。 ...

    Android 消息机制问题总结

    Android的消息机制几乎是面试必问的话题,当然也并不是因为面试,而去学习,更重要的是它在Android的开发中是必不可少的,占着举足轻重的地位,所以弄懂它是很有必要的。下面就来说说最基本的东西。 Looper 作用: ...

    【学写申请书】国家与教育部等社科类基金项目的研究思路与路线图模板

    实践研究——交流总结——申请结题”的程序进行。技术路线是指申请者对要达到研究目标 准备采取的技术手段、具体步骤及解决关键性问题的方法等在内的研究途径,应尽可能详尽 ,每一步骤的关键点要阐述清楚并具有可...

    Java2游戏编程.pdf

    4.1.8 java.lang.Thread 4.2 java.io包 4.3 java.util包 4.3.1 java.util.StringTokenizer 4.3.2 java.util.Random 4.3.3 Java2集合框架 4.4 总结 4.5 练习 第2篇 Java 2-D图像开发和抽象Window工具包 第5章 Applet...

    【RT-Thread作品秀】多功能气压计设计-电路方案

    不仅如此,为增加任务在运行状态中的时间和提高每个任务响应的快慢速度,故使用线程中重要的两个属性即线程优先级和时间片,并根据应用的具体环境和软实时性的要求将每个任务赋予各自该具有的任务优先级和时间片。...

    《深入理解Android》卷Ⅰ

    4.3.2 SystemServer的重要使命 4.3.3 关于 SystemServer的总结 4.4 zygote的分裂 4.4.1 ActivityManagerService发送请求 4.4.2 有求必应之响应请求 4.4.3 关于zygote分裂的总结 4.5 拓展思考 4.5.1 虚拟机heapsize的...

    java多线程应用实现方法

    以前没有写笔记的习惯,现在慢慢的发现及时总结是多么的重要了,呵呵。虽然才大二,但是也快要毕业了,要加油了。 这一篇文章主要关于java多线程,主要还是以例子来驱动的。因为讲解多线程的书籍和文章已经很多了,...

    java课程设计报告-五子棋(1).doc

    创建线程的方法: 一种是创建Thread类的子类。另一种是实现Runnable接口.而本系统采用的是接口的方式 。 6.Applet小应用程序 、 小应用程序与应用程序的区别: 小应用程序没有主方法不能单独运行。而应用程序是拥有...

    java课程设计报告-五子棋.doc

    创建线程的方法: 一种是创建Thread类的子类。另一种是实现Runnable接口.而本系统采用的是接口的方式 。 6.Applet小应用程序 、 小应用程序与应用程序的区别: 小应用程序没有主方法不能单独运行。而应用程序是拥有...

    java课程设计报告-五子棋(2).doc

    创建线程的方法: 一种是创建Thread类的子类。另一种是实现Runnable接口.而本系统采用的是接口的方式 。 6.Applet小应用程序 、 小应用程序与应用程序的区别: 小应用程序没有主方法不能单独运行。而应用程序是拥有...

    深入理解Android卷1全

    4.3.2 SystemServer的重要使命 / 77 4.3.3 关于 SystemServer的总结 / 83 4.4 zygote的分裂 / 84 4.4.1 ActivityManagerService发送请求 / 84 4.4.2 有求必应之响应请求 / 86 4.4.3 关于zygote分裂的总结 / 88 4.5 ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段14讲、Thread的join方法详细介绍,结合一个典型案例.mp4 │ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发编程第一阶段16讲、采用优雅的方式结束线程生命周期....

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段14讲、Thread的join方法详细介绍,结合一个典型案例.mp4 │ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发编程第一阶段16讲、采用优雅的方式结束线程生命周期....

Global site tag (gtag.js) - Google Analytics