热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java多线程线程的状态和操作系统中进程状态的对应关系

一java中的线程操作系统的进程五个状态:新建,就绪,运行,等待,结束线程一共有六种状态TERMINATED结

一 java中的线程

操作系统的进程五个状态:新建,就绪,运行,等待,结束

线程一共有六种状态

TERMINATED   结束 包括正常结束和异常结束
NEW                  新建状态 也就是对象创建了,但还没执行start方法

BLOCKED         锁池状态(也有说是阻塞状态) 等待的一种,特指等着获得锁,也就是被堵在syn方法外面。被挂到锁对象的阻塞队列上了

WAITING          等待事件发生,常常使用wait()方法 进入此状态,挂到锁对象的等待队列上。。
TIMED_WAITING  跟等待状态差不多,只不过时间到了,就进入可运行状态了(但是随之就有可能因为没抢到锁,到锁池状态)

      以上三个状态个人认为都是操作系统中的 等待(阻塞)状态
 
RUNNABLE     可运行状态   是操作系统中就绪状态和运行状态

 

这里有个待研究的点是 使用文件输入流读入一个大文件,我测试是超时等待状态。预想该是一种等待状态。。待解决

 

总结: java线程把就绪和运行合为一个状态---可运行;同时把等待分成三个状态 等待 ,阻塞(锁池) ,定时等待

 

二 demo 

以下的这一段代码可以更好的体现   这几种状态 当然0,1,2,3的顺序可能不一致,看调度结果

public class Main {private static int i = 0;static class MyThread extends Thread{@Overridepublic void run() {try {get();} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) throws InterruptedException {Thread[] arr = new Thread[10];arr[0] = new MyThread();arr[1] = new MyThread();arr[2] = new MyThread();arr[3] = new MyThread();arr[4] = new MyThread();arr[0].start();arr[1].start();arr[2].start();arr[3].start();Thread.currentThread().sleep(1000); //主线程等一下 让四个子线程先执行System.out.println(arr[0].getState()); //BLOCKED 第四名 没抢到锁 锁池状态System.out.println(arr[1].getState()); //WAITING 第一名 抢到锁 进入等待状态System.out.println(arr[2].getState()); // TIMED_WAITING 第三名 进入定时等待状态System.out.println(arr[3].getState()); //TERMINATED 第二名 直接return 结束System.out.println(arr[4].getState()); //还没startSystem.out.println(Thread.currentThread().getState()); // 主线程 运行状态}public static synchronized void get() throws InterruptedException {i++;if(i==1)Main.class.wait(); //第一次进入 等待if(i==2)return; //第二次进入 直接返回Thread.currentThread().sleep(1000*5); // 第三次进入超时等待}}

  

 

 

转:https://www.cnblogs.com/caijiwdq/p/11164218.html



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
author-avatar
手机用户2602930391
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有