cho1.
基本问题
- 什么是进程
程序执行时的一个实例,系统为每个进程分配不同的内存区域。 - 什么是线程
进程中包括一个或多个线程,线程切换的开销小。 - 什么是多线程
并行执行多个线程。
4.学习要点
- 多写代码练习,多次观察运行结果。
- 理解时候利用画图,思路会比较清晰。
- 线程并发是重点(这里我没有细说,后面补充)
cho2.
CPU资源分配
- 系统中存在多个进程,CPU为每个进程分配内存区域。
- 进程获得的内存区域具有共享区域,每个线程具有各自独立的栈区。
- 共享区域分为三段:
- 代码段:存放代码、常量。
- 数据段:存放全局变量、静态变量。
- 扩展段:堆存储。
- 线程的栈区存储着线程内的局部变量、临时变量。
cho3.
三种线程分布
- 单线程程序
一个简单那的程序,只具有一个基本的main线程。所有的程序一定存在一个主线程。 - 基本Java程序
Java程序本身具有垃圾回收机制和异常机制。因此,基本的Java程序,具有以下三个线程:
- main:主线程。
- gc:垃圾回收线程。
- exception:异常处理线程。
- 多线程Java程序
在基本的Java程序基础上,增加多个线程。
cho4.
守护线程&用户线程
- 线程分为两类:守护线程、用户线程。
- 守护线程为用户线程服务,用户线程使用setDeamon(true),可以将用户线程设置为守护线程。
- 常见的守护线程:垃圾回收线程。
- 当JVM中只存在守护线程,则JVM退出;守护线程会随主线程一起消亡。
cho5.
线程的生命周期
参考链接:多线程(一):创建线程和线程的常用方法
这里只做简略描述,更多细节可以去参考链接中查看,本部分很多内容都借鉴了该链接。
线程的创建
方式一:(不推荐)
- 继承Thread类。
- 重写run方法。
- 创建线程对象。
- 调用start方法:启动线程,调用run方法。
方式二:(线程无返回值)
1)实现Runnable接口。
2) 重写run方法。
3) 通过含参构造器创建线程对象。
4) 调用start方法
Thread implements Runnable
方式三:(线程有返回值)
1)实现Callable接口。
2)重写call方法。
3)使用FutureTask封装线程对象。
4)使用Thread封装futureTask对象。
5)调用start方法。
FutureTask implements RunnableFuture
RunnableFuture extends Runnable
线程的调度
- 线程调度策略:优先级高的线程,抢占CPU资源。
- 调度方法:
- 优先级相同,按照等待队列先进先出。
- 优先级高,优先调度抢占策略。
- 优先级范围1(Min)-10(Max)
- 相关方法:getPriority/setPriority
- 子类线程继承父类线程的优先级。
cho6.
常用方法一览
方法名 | 说明 |
---|---|
start | 启动一个线程,将线程加入线程队列 |
run | 线程的主体操作内容,即线程体 |
getName | 获取线程名称 |
setName | 设置线程名称 |
currentThread | 返回当前线程实例 |
sleep | 线程进入休眠,保留同步锁 |
interrupt | 打断线程休眠,进入就绪状态 |
wait | 线程进入等待状态,释放同步锁。该方法必须写在synchronized内。 |
notify | 唤醒休眠或者等待的线程。该方法必须写在synchronized内。 |
join | 若在A线程执行时,调用了B线程的join,则A线程等待阻塞,直到B线程结束,A线程才会进入执行状态。 |
yield | 让线程进入就绪状态,不会释放锁。 |
setDaemon | 将线程设置为守护线程。 |