什么是线程?
- 线程是一个基本的CPU执行单元&程序执行流的最小单眼,它是比进程更小的可独立运行的可独立运行的基本单位,==>轻量级进程;
组成:线程ID + 程序计数器 + 寄存器集合 + 堆栈;
- 线程自己不拥有系统资源,与其他线程共享进程所拥有的全部资源。
线程的作用:
是减少程序在并发执行时所付出的时空开销,提高操作系统的并发性能。线程的基本状态:
就绪、阻塞、运行3种基本状态
注意 就绪、阻塞状态的区别:
就绪状态:进程缺少的资源 = 处理机,只要获得处理机资源立即执行 等待状态:指 进程缺少其他资源(除了处理机) / 等待某一事件
线程分类
线程主要分为:守护线程、非守护线程(用户线程);
上面两种线程的区别:看虚拟机是否已退出;当所有用户线程结束时,因为没有守护的必要,所以守护线程也会终止,虚拟机也同样退出; 反过来,只要任何用户线程还在运行,守护线程就不会终止,虚拟机就不会退出
守护线程:守护用户线程的线程,即在程序运行时为其他线程提供一种通用服务,如垃圾回收线程。thread.setDaemon(true);
非守护线程:主线程/子线程;
在Android里,主线程指的是UI线程
,Android系统在程序启动时自己启动的一条主线程,处理四大组成与用户进行交互的事件,如更新UI数据等;而子线程又称为工作线程
,主要用于耗时的操作(网络请求,I/O操作,数据库操作等)。
线程优先级:
默认是5,最高是10;Thread.NORM_PRIORITY
,通过方法setPriority(int grade)
设置;
多线程
多线程指的是多个线程同时进行,即多个任务同时进行;(但其实计算机在任何时刻都只能执行一个任务,多线程只是一个人的错觉,只是因为JVM快速调度资源来轮换线程,使得线程不断轮流执行,所以看起来好像在同时执行多个任务而已)。
Android官方声明:在多线程编程时有两大原则:
- 不能阻塞UI线程(即主线程):单线程会导致主线程阻塞,然后出现ANR错误:主线程被阻塞超过5s则会出现错误
- 不要在UI线程之外更新UI组件
所以,我们在日常开发中需要(一个主线程和n个工作线程)来解决问题。将耗时任务从主线程抛到工作线程中进行,将更新UI组件任务从工作线程抛到主线程中进行
线程调度(关于其他调度方式可以去看关于操作系统的书)
- 当系统存在大量线程时,系统会通过
时间片轮转
的方式调度线程; - 处于就绪状态(Runnable)的线程都会进入到线程队列中等待CPU资源;
- 在采用时间片的系统中,每个线程获得CPU的资源的机会都是均等的;当线程使用CPU资源的时间到后,不管线程有没有完成自己的全部操作,JVM也会中断当前线程的执行,把CPU资源的使用权切换给下一个队列中等待的线程。
被中断的线程将等待CPU资源的下一次青睐,然后从上一次的中断处继续执行。
- 线程调度也和优先级有关,优先级高知识获得青睐的机会大一点,而不是霸占。
关于线程同步 Synchronized
[https://www.jianshu.com/p/2ed498b43628]
作者:Carson_Ho
参考文章:[Carson_Ho:https://carsonho.blog.csdn.net/article/details/90690840]