1.什么是多线程?
线程=生产线
多线程=多条生产线
2.为什么要学习多线程?
提高程序的执行效率(例如一次上传多张图片、例如迅雷同时下载多个文件)
并行:在同一时刻,多条指令在多个cpu核心上同时执行。
并发:在一段时间内,多条指令在一个cpu核心上交替执行。
进程:os资源分配的最小单位,就是程序的执行过程,可以理解为正在执行的程序。
独立性:进程是一个能独立运行的基本单位,同时也是os调度,分配资源的的独立单位
动态性:进程的实质是程序的一次执行过程,是动态产生,也是动态消亡的
并发性:任何进程都可以和其他进程一起并发执行
线程是cpu调度的最小单位,它是进程的一部分,是进程中的单个控制流,是一条执行路径。
一个进程中有多条线程就称之为多线程
继承Thread类的方式进行实现
实现Runnable接口的方式进行实现
利用Callable和Future接口方式实现
2.方法介绍
方法名 | 说明 |
---|---|
void run() | 在线程开启后,此方法将被调用执行 |
void start() | 使此线程开始执行,Java虚拟机会调用run方法() |
1.为什么要重写run()方法?
因为run()是用来封装被线程执行的代码
2.run()方法和start()方法的区别?
run():封装线程执行的代码,直接调用,相当于普通方法的调用
start():启动线程;然后由JVM调用此线程的run()方法
1.实现Runnable、Callable接口
好处: 扩展性强,实现该接口的同时还可以继承其他的类
缺点: 编程相对复杂,不能直接使用Thread类中的方法
2.继承Thread类
好处: 编程比较简单,可以直接使用Thread类中的方法
缺点: 可以扩展性较差,不能再继承其他的类
3.三种实现方式的应用场景
如果不需要线程的返回值就使用Runnable,需要返回值就使用Callable
方法介绍
方法名 | 说明 |
---|---|
void setName(String name) | 将此线程的名称更改为等于参数name |
String getName() | 返回此线程的名称 |
方法名 | 说明 |
---|---|
Thread currentThread() | 返回对当前正在执行的线程对象的引用 |
1.相关方法
方法名 | 说明 |
---|---|
static void sleep(long millis) | 使当前正在执行的线程停留(暂停执行)指定的毫秒数 |
1.线程调度有哪两种调度方式
分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些
2.Java使用什么调度模型?
抢占式调度模型
3.多线程执行有什么特点?
随机性
4.优先级相关方法
方法名 | 说明 |
---|---|
final int getPriority() | 返回此线程的优先级 |
final void setPriority(int newPriority) | 更改此线程的优先级线程默认优先级是5;线程优先级的范围是:1-10 |
5.如何正确的设置优先级呢?
设置线程优先级时,针对频繁阻塞(休眠或者I/O操作)的线程需要设置较高优先级,而偏重计算(需要较多CPU时间或者偏运算)的线程则设置较低的优先级,确保处理器不会被独占。
6.设置优先级的注意事项?
在不同的JVM以及操作系统上,线程规划会存在差异,有些操作系统甚至会忽略对线程优先级的设定 (Mac OS10 Ubuntu 14.04环境 )
1.什么是守护线程?
守护线程是程序运行的时候在后台提供一种通用服务的线程(GC)(杀毒软件实时监控)
2.守护线程的特点?
所有用户线程停止,进程才会停掉所有守护线程,然后退出程序
3.如何使用守护线程?
相关方法
方法名 | 说明 |
---|---|
void setDaemon(boolean on) | 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出 |
原文:https://www.cnblogs.com/zhangmeng0726/p/14623304.html