解析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篇(一)相关推荐

  1. JAVA多线程基础篇-关键字synchronized

    1.概述 syncronized是JAVA多线程开发中一个重要的知识点,涉及到多线程开发,多多少少都使用过.那么syncronized底层是如何实现的?为什么加了它就能实现资源串行访问?本文将基于上述 ...

  2. JAVA多线程设计模式篇 1、什么是多线程设计模式

    文章目录 1. 从物种进化说起 2. 十二种武器 总结 1. 从物种进化说起 寒武纪时期之前,所有的生物都没有进化出眼睛,突然有一天,许多生物们都开始有了视觉.能看见多姿多彩的世界,周围的环境.敌人和 ...

  3. JAVA多线程设计模式篇 12、Thread-Specific Storage模式——给我个柜子

    文章目录 1. ThreadLocal的使用示例 2. ThreadLocal的使用场景 2.1 线程隔离的数据库连接与事务 2.2 线程隔离的session会话 总结 多线程环境中即然共用资源这么困 ...

  4. 多线程面试题_线程,代码和数据–多线程Java程序实际运行的方式

    多线程面试题 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后您才意识到,这是我最想念的那几年,这是非常基本的. 了解多线程Java程序的执行方式就是其中之一. 您肯定已经 ...

  5. java8多线程运行程序_线程,代码和数据–多线程Java程序实际运行的方式

    java8多线程运行程序 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后才意识到,这是非常基本的事情,我为什么错过了这么多年. 了解多线程Java程序的执行方式就是其中之 ...

  6. 线程,代码和数据–多线程Java程序实际运行的方式

    有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后才意识到,这是非常基本的事情,我为什么错过了这么多年. 了解多线程Java程序的执行方式就是其中之一. 您肯定已经听说过线程 ...

  7. java 监控对象是什么_多线程-Java中的对象监视器是什么意思? 为什么要使用这个词?...

    多线程-Java中的对象监视器是什么意思? 为什么要使用这个词? 在阅读有关Java线程的文章时,我经常注意到这样的表达:"当前线程是该对象的监视器的所有者". 我的意思是:线程有 ...

  8. 多线程并发篇(1024节日快乐)

       前言:七月末八月初的时候,秋招正式打响,公司会放出大量的全职和实习岗位.为了帮助秋招的小伙伴们,学长这里整理了一系列的秋招面试题给大家,所以小伙伴们不用太过焦虑,相信你们一定能超常发挥,收到心仪 ...

  9. 明翰Java教学系列之认识Java篇V1.3(持续更新)

    文章目录 传送门 前言 什么是Java? Java之父 `Java的应用场景` Java部分特点 Java工作机制 JDK(Java Development Kit) JRE(Java Runtime ...

  10. 面试宝典Java篇(基础+高级+集合+线程+IO+JVM)

    一.Java篇 1.1 Java基础篇 1.请你讲讲&和&&的区别? &运算符有两种用法:(1)按位与:(2)逻辑与. &&运算符是短路与运算. 逻辑与 ...

最新文章

  1. 零基础学Python:一文看懂数字和字符串
  2. flex 单独一行_Flex网页布局一CSS弹性伸缩盒子语法教程
  3. LNMP添加、删除虚拟主机及伪静态使用教程
  4. 「日常训练」Skills(Codeforce Round #339 Div.2 D)
  5. AI人的Home—TechBeat!!!
  6. Android常用权限
  7. SAP 电商云 Spartacus 产品明细页面的 pageContext 如何获取的?
  8. qtabwidget切换tab事件_某超超临界机组初压/限压切换过程中扰动原因分析
  9. POJ1459-Power Network
  10. 【数字逻辑设计】Logisim构建锁存器/触发器
  11. 草丛三剑客之逆向生成
  12. 一个七年的老测试给想入行软件测试这个行业的二十条建议
  13. 半深入理解CSS3 object-position/object-fit属性
  14. php计算时间差js,js 求时间差怎么求实例代码
  15. Magick.NET图片处理:解决png转jpg背景色为黑色的问题(设置背景色)
  16. 如何获取div中的value值
  17. 按摩器具抽查三成不合格 选购需注意哪些?
  18. selenium浏览器驱动下载地址
  19. [2019][CVPR]Balanced Self-Paced Learning for Generative Adversarial Clustering Network 笔记
  20. h5页面跳转关注公众号

热门文章

  1. 很多人已经不会用WINDOWS的命令行、DOS命令了
  2. chrome安装测试打包插件
  3. 无锡硕放机场建议改名为金苏机场
  4. MySQL的初次使用
  5. 祝贺吾博文中第一篇点击超过一万的文章出现
  6. XCODE中,修改苹果APP支持哪些设备
  7. 管理感悟:计划是给谁看的
  8. wpf获取当前窗体的屏幕坐标
  9. 利用vs 分析DMP文件、pdb文件定位release下的异常崩溃
  10. git 怎么还原历史版本_git 还原到服务器版本