多线程JAVA篇(一)
解析AsyncTask源码之前,首先讲述与之相关的Java线程知识:
知识点清单
1、Thread类
2、Runnable接口
3、Callable接口
4、synchronized关键字
5、volatile关键字
6、Future接口
7、RunnableFuture接口
8、FutureTask类
9、线程池的相关知识
/*** A representation of a thread's state. A given thread may only be in one* state at a time.*/public enum State {/*** The thread has been created, but has never been started.*/NEW,/*** The thread may be run.*/RUNNABLE,/*** The thread is blocked and waiting for a lock.*/BLOCKED,/*** The thread is waiting.*/WAITING,/*** The thread is waiting for a specified amount of time.*/TIMED_WAITING,/*** The thread has been terminated.*/TERMINATED}
大家发现这个枚举里面列举了六种状态,实际上线程一共只有四种状态:
1、新建(NEW):当线程被创建时,它只会短暂处于这种状态。此时它已经分配了必需的系统资源,并执行了初始化。此刻线程已经有了资格获得CPY时间,之后调度器将把这个线程转变为可运行状态或阻塞状态。
2、就绪(RUNNABLE):在这种状态下,只要调度器把时间片分配给线程,线程就可以运行。也就是说,在任意时刻,线程可以运行也可以不运行。只要调度器能分配时间片给线程,它就可以运行;这不同于死亡和阻塞状态。
3、阻塞(BLOCKED、WAITING、TIMED_WAITING):线程能够运行,但有某个条件阻止它的运行。当线程处于阻塞状态时,调度 器将会忽略线程,不会分配给线程任何CPU时间。直到线程重新进入就绪状态,它才有可能执行操作
4、死亡(TERMINATED)处于死亡或终止状态的线程将不再是可调度的,并且再也不会得到CPU时间,它的任务已结束,或不再是可运行的。任务死亡的通常方式从run方法返回,但是任务的线程还可以被中断,你将要看到这一点。
下面通过代码实例的方法为大家演示这六种状态:
public class ThreadTest {public static void main(String[] args) {final Thread thread = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10000; i++) {}}});System.out.println("线程名" + thread.getName() + "线程状态" +thread.getState());thread.start();System.out.println("线程名" + thread.getName() + "线程状态" +thread.getState());Thread threadTest = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("线程名" + thread.getName() + "线程状态" +thread.getState());}});System.out.println("线程名" + threadTest.getName() + "线程状态" +threadTest.getState());threadTest.start();System.out.println("线程名" + thread.getName() + "线程状态" +thread.getState());System.out.println("线程名" + threadTest.getName() + "线程状态" +threadTest.getState());}
}
打印日志1:
线程名Thread-0线程状态NEW
线程名Thread-0线程状态RUNNABLE
线程名Thread-1线程状态NEW
线程名Thread-0线程状态TERMINATED
线程名Thread-1线程状态RUNNABLE
线程名Thread-0线程状态TERMINATED
打印日志2:
线程名Thread-0线程状态NEW
线程名Thread-0线程状态RUNNABLE
线程名Thread-1线程状态NEW
线程名Thread-0线程状态RUNNABLE
线程名Thread-1线程状态RUNNABLE
线程名Thread-0线程状态RUNNABLE
public class ThreadTestTwo {public static void main(String[] args) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000000000; i++) {}}});System.out.println("线程名" + thread.getName() + "线程状态"+ thread.getState());thread.start();System.out.println("线程名" + thread.getName() + "线程状态"+ thread.getState());try {Thread.sleep(1);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("线程名" + thread.getName() + "线程状态"+ thread.getState());}
}
打印日志:
线程名Thread-0线程状态NEW
线程名Thread-0线程状态RUNNABLE 线程名Thread-0线程状态RUNNABLE
我来为大家分析一下这几个日志:
大家可以看到第一个线程就是thread线程,在Thread.start()方法调用之前是这个线程的状态是New(新建状态),在线程 Thread.start()方法调用之后线程的状态为Runnbale(就绪状态),在任务执行完之后状态变为Terimal(终止状态),大家可能发 现打印日志1和打印日志2略有不同,因为当线程threadTest的启动了之后,thread的任务有没有执行完成其实是一个未知不可确定的事情。这个 测试代码中还有一个知识点,大家有没有发现最后日志打印结果显示打印的最后日志竟然是Thread-0,很多人要问了最后一个日志不应该是 threadTest(Thread-1)么,其实不是因为threadTest的这个是在主线程中执行的,而有一个打印是在threadTest方法中 的,所以threadTest.run()方法中的打印日志才是最后一个,主线程的优先级是要比普通线程的优先级要高。但是不要去使用优先级去控制线程的 执行顺序,因为那并不可靠。但是因为优先级这部分使用的很少,也不是很重要,这里就不详细论述了,有兴趣的可以去看看。
通过上面这部分测试代码我们认识了线程这个类的三种状态,总结一下:
1、一个线程创建之后没有调用Thread.start()方法之前线程的状态是NEW
2、一个线程调用Thread.start()方法之后,线程的状态是RUNNABLE,无论线程是否在运行状态下线程,大家可以看第二个日志调用了Thread.sleep()方法线程的状态并没有改变可以得知
3、一个线程执行完任务之后,线程的状态就是Terimal(终结)
下面为大家讲述线程中的另外一个状态阻塞,阻塞状态又分三种(BLOCKED、WAITING、TIMED_WAITING),在讲阻塞状态之前又不可避免的先要为大家讲述一下synchronized这个关键字
转载于:https://www.cnblogs.com/ljsy-yjx/p/5472741.html
多线程JAVA篇(一)相关推荐
- JAVA多线程基础篇-关键字synchronized
1.概述 syncronized是JAVA多线程开发中一个重要的知识点,涉及到多线程开发,多多少少都使用过.那么syncronized底层是如何实现的?为什么加了它就能实现资源串行访问?本文将基于上述 ...
- JAVA多线程设计模式篇 1、什么是多线程设计模式
文章目录 1. 从物种进化说起 2. 十二种武器 总结 1. 从物种进化说起 寒武纪时期之前,所有的生物都没有进化出眼睛,突然有一天,许多生物们都开始有了视觉.能看见多姿多彩的世界,周围的环境.敌人和 ...
- JAVA多线程设计模式篇 12、Thread-Specific Storage模式——给我个柜子
文章目录 1. ThreadLocal的使用示例 2. ThreadLocal的使用场景 2.1 线程隔离的数据库连接与事务 2.2 线程隔离的session会话 总结 多线程环境中即然共用资源这么困 ...
- 多线程面试题_线程,代码和数据–多线程Java程序实际运行的方式
多线程面试题 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后您才意识到,这是我最想念的那几年,这是非常基本的. 了解多线程Java程序的执行方式就是其中之一. 您肯定已经 ...
- java8多线程运行程序_线程,代码和数据–多线程Java程序实际运行的方式
java8多线程运行程序 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后才意识到,这是非常基本的事情,我为什么错过了这么多年. 了解多线程Java程序的执行方式就是其中之 ...
- 线程,代码和数据–多线程Java程序实际运行的方式
有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后才意识到,这是非常基本的事情,我为什么错过了这么多年. 了解多线程Java程序的执行方式就是其中之一. 您肯定已经听说过线程 ...
- java 监控对象是什么_多线程-Java中的对象监视器是什么意思? 为什么要使用这个词?...
多线程-Java中的对象监视器是什么意思? 为什么要使用这个词? 在阅读有关Java线程的文章时,我经常注意到这样的表达:"当前线程是该对象的监视器的所有者". 我的意思是:线程有 ...
- 多线程并发篇(1024节日快乐)
前言:七月末八月初的时候,秋招正式打响,公司会放出大量的全职和实习岗位.为了帮助秋招的小伙伴们,学长这里整理了一系列的秋招面试题给大家,所以小伙伴们不用太过焦虑,相信你们一定能超常发挥,收到心仪 ...
- 明翰Java教学系列之认识Java篇V1.3(持续更新)
文章目录 传送门 前言 什么是Java? Java之父 `Java的应用场景` Java部分特点 Java工作机制 JDK(Java Development Kit) JRE(Java Runtime ...
- 面试宝典Java篇(基础+高级+集合+线程+IO+JVM)
一.Java篇 1.1 Java基础篇 1.请你讲讲&和&&的区别? &运算符有两种用法:(1)按位与:(2)逻辑与. &&运算符是短路与运算. 逻辑与 ...
最新文章
- 零基础学Python:一文看懂数字和字符串
- flex 单独一行_Flex网页布局一CSS弹性伸缩盒子语法教程
- LNMP添加、删除虚拟主机及伪静态使用教程
- 「日常训练」Skills(Codeforce Round #339 Div.2 D)
- AI人的Home—TechBeat!!!
- Android常用权限
- SAP 电商云 Spartacus 产品明细页面的 pageContext 如何获取的?
- qtabwidget切换tab事件_某超超临界机组初压/限压切换过程中扰动原因分析
- POJ1459-Power Network
- 【数字逻辑设计】Logisim构建锁存器/触发器
- 草丛三剑客之逆向生成
- 一个七年的老测试给想入行软件测试这个行业的二十条建议
- 半深入理解CSS3 object-position/object-fit属性
- php计算时间差js,js 求时间差怎么求实例代码
- Magick.NET图片处理:解决png转jpg背景色为黑色的问题(设置背景色)
- 如何获取div中的value值
- 按摩器具抽查三成不合格 选购需注意哪些?
- selenium浏览器驱动下载地址
- [2019][CVPR]Balanced Self-Paced Learning for Generative Adversarial Clustering Network 笔记
- h5页面跳转关注公众号