/*** 线程的状态分析

*@authoraa

**/

public classThreadState {public static void main(String[] args) throwsException {/*** 新建线程,线程为新建状态

* jdk:至今尚未启动的线程的状态。

* 如果不给线程设置名称,线程的名称将会是:Thread-0,Thread-1。。。。。*/ThreadDemo td= newThreadDemo() ;

System.out.println("新建状态:" + td.getState()) ; //新建状态:NEW

/*** 可运行状态:当线程有资格运行,调用start方法,线程首先进入可运行状态,

* 可运行状态,不一定被线程调度程序运行,

* 简单来说,调用start方法后,该线程依然是可运行状态,但未运行,

* 存放在可运行池中,

* 线程在运行的过程中,该线程的状态也是可运行状态

*

* djk:可运行线程的线程状态。处于可运行状态的某一线程正在 Java 虚拟机中运行,

* 但它可能正在等待操作系统中的其他资源,比如处理器。*/td.start() ;

System.out.println("可运行状态:" + td.getState()) ; //可运行状态:RUNNABLE

/*** Main线程休眠100毫秒时,td线程也就调用了waitForTwoSecond()方法,

* 指定休眠2秒后,再回到可运行状态

* 指定等待一定时长时,休眠状态:TIMED_WAITING

* jdk:具有指定等待时间的某一等待线程的线程状态。某一线程因为调用以下带有指定正等待时间的方法之一而处于定时等待状态:

* 带有超时值的 Thread.sleep (sleep必须带值)

* 带有超时值的 Object.wait

* 带有超时值的 Thread.join*/Thread.sleep(100);

System.out.println("休眠状态:" + td.getState()) ; //具有指定等待时间的某一等待线程的线程状态。

/*** 这里Main线程一共休眠2100毫秒时,td线程调用了waitLong()方法,

* 该方法调用了wait(),使线程处于一直等待的状态

* jdk:某一等待线程的线程状态。某一线程因为调用下列方法之一而处于等待状态:

* 不带超时值的 Object.wait

* 不带超时值的 Thread.join*/Thread.sleep(2000);

System.out.println("等待状态:" + td.getState()) ; //等待状态:WAITING

td.interrupt() ;/*** 这里输出的也可能是终止状态

* jdk:受阻塞并且正在等待监视器锁的某一线程的线程状态。处于受阻塞状态的某一线程正在等待监视器锁,

* 以便进入一个同步的块/方法,或者在调用 Object.wait 之后再次进入同步的块/方法。*/td.notifyWait() ;

System.out.println("阻塞状态:" +td.getState()) ;/*** jdk:已终止线程的线程状态。线程已经结束执行。*/Thread.sleep(1000);

System.out.println("终止状态:" +td.getState()) ;/*** 可以简单归纳为:新建 , 可运行 , 运行 , 阻塞 , 死亡

*

* Thread.yeild() 让当前运行的线程回到可运行状态,让出时间给其他线程运行,但可能没用

* jdk:暂停当前正在执行的线程对象,并执行其他线程。*/

/*** join()的用法

* jdk:等待该线程终止的时间最长为 millis 毫秒。超时为 0 意味着要一直等下去。

* 简单来说,如下,由于td线程被Main线程所启动,td线程调用join方法后,

* 也就是Mian线程要等到td线程运行完毕才会执行join方法后面的代码,

* jdk的解析在这里就是将Main线程加入到了td线程的后面

* join加参数,在这里意思就是Main线程需要等待2秒时间再继续执行join方法后面的代码,*/

//td.join() ;//td.join(2000) ;

System.out.println("线程加入join之后") ;

}private static class ThreadDemo extendsThread {

@Overridepublic voidrun() {try{//测试join方法//for (int i = 0; i < 5; i++) {//System.out.println(i);//sleep(1000) ;//}

waitForTwoSecond() ;

waitLong() ;

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}public synchronized void waitForTwoSecond() throwsException {

wait(2000) ;

}public synchronized void waitLong() throwsException {

wait() ;

}public synchronized void notifyWait() throwsException {

notify() ;

}

}

}

java 精灵线程_Java线程的状态分析相关推荐

  1. 简述java的线程_JAVA线程简述

    一.先谈谈并行与并发: 并行:是指两个或多个事件在同一时刻发生. 并发:是指连个或多个事件在同一时间间隔内发生. 二.接下来我们进入正题,讨论一下线程和进程: 1)什么是线程和进程? 进程:是一个具有 ...

  2. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  3. java 优化线程_JAVA线程优化

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  4. java 访问线程_java线程简介(共享对数据的访问)

    1. 共享变量 要使多个线程在一个程序中有用,它们必须有某种方法可以互相通信或共享它们的结果. 让线程共享其结果的最简单方法是使用共享变量.它们还应该使用同步来确保值从一个线程正确传播到另一个线程,以 ...

  5. java怎么看具体被挂起的线程_Java线程的挂起、恢复和终止

    有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线 ...

  6. java runnable 异常_JAVA 线程中的异常捕获

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...

  7. java+向前进一_Java 线程基础

    前言 线程并发系列文章: 熟练掌握线程原理与使用是程序员进阶的必经之路,网上很多关于Java线程的知识,比如多线程之间变量的可见性.操作的原子性,进而扩展出的Volatile.锁(CAS/Synchr ...

  8. linux下java转储线程_Java线程转储prio值与linux上的真实线程优先级不对应?

    我打算在我的 Java代码中使用线程优先级. 应用程序应在我的 Linux系统上运行: >uname -a Linux 3.0.0-15-generic #26-Ubuntu SMP x86_6 ...

  9. 抽象类java启动线程_java 线程复习笔记

    1. 线程基本概念 1.1 线程与进程 当一个程序进入内存运行时,即变成一个进程.进程是系统进行资源分配和调度的一个独立单元. 线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程 ...

最新文章

  1. Cell Reports:中科院动物所魏辅文组解析大熊猫肠道菌群季节性变化的功能
  2. 重磅!!kaggle训练, 终于不用怕断网了
  3. VTK:图表之RemoveIsolatedVertices
  4. IOS和Android音频开发总结
  5. 《TCP/IP详解》学习笔记(六):UDP 协议
  6. SpringBoot集成Maven工程
  7. Install Oracle on RHEL5 - step by step
  8. php 7 中对数值 * 100 出现很多小数_PHP快速入门第二讲:数据类型
  9. java EE :GenericServlet 抽象类、ServletConfig 接口
  10. synchronized 修饰在 static方法和非static方法的区别
  11. Introduction to Computer Networking学习笔记(十八):Switching 交换工作实现
  12. 让模拟器也支持GPS定位(模拟实现)
  13. Scrum:官僚者们的游戏
  14. MySQL 视图(详解)
  15. android第三方浏览器存在泄露用户隐私漏洞
  16. Arduino学习笔记——IED界面和设置
  17. 用qrcode生成微信支付二维码
  18. sql语句查询某字段中包含某值(模糊查找)
  19. 前端基础知识学习 XML JSON RESTFUL SOAP WEBSERVICE
  20. python画pr曲线_python 画函数曲线示例

热门文章

  1. php跳转分站,PHP判断IP并转跳到相应城市分站的方法
  2. 第7章-选择器+伪类
  3. vue js table colspan rowspan
  4. prettier 配置参数说明
  5. 04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度
  6. pads导出坐标文件html,【教程】PADS如何导出SMT贴片机用的坐标文件
  7. 【软件开发底层知识修炼】十四 快速学习GDB调试一 入门使用
  8. 【Makefile由浅入深完全学习记录3】伪目标的引入
  9. (转)分布式锁的几种使用方式(redis、zookeeper、数据库)
  10. [Poi2011]Tree Rotations线段树合并