title: Java线程
date: 2020-07-25 12:14:41
tags:
categories:
- 面试题
- Java线程
线程基础
- 何为线程、进程
- 简要描述线程、进程之间的关系、区别以及优缺点
- 运行时数据区图
- 图示:
- 程序计数器为什么是私有的
- 虚拟机栈和本地方法栈为什么是私有的
- 介绍一个堆和方法区
- 图示:
- 关系
- 一个线程中可能包含一个或者多个线程
- 线程是进程划分的更小的执行单位
- 区别
- 线程占用的系统资源比进程少
- 线程之间的切换的开销小,切换速度快
- 进程是各自独立的运行
- 优缺点
- 线程之间的切换开销小。线程之间切换时候,依据程序计数器的变化;当程序计数器为0时,说明线程空闲,可以直接执行;当线程执行时候,程序计数器会一直累加,而线程执行完成后,程序计数器会累减,直到程序计数器为0,线程才是空闲的
- 线程占用资源少。程序要想获得资源,需要获取cpu的时间片,等CPU时间片是空闲时候,程序可以直接调用资源;当CPU时间片是忙碌时候,线程需要等待CPU空闲才可以调用资源
- 进程不利于资源的管理和保护
- 运行时数据区图
- 说一说并发和并行的区别
- 并行 在单位时间内,多个任务同时运行
- 并发 在一个时间段内,多个任务同时运行
- 为什么使用多线程
- 充分的利用系统资源,多核CPU时代,减少上下文切换的开销,提高CPU的利用率
- 提高系统的并发能力和性能
- 使用多线程的问题
- 线程安全问题
- 线程死锁问题(后面会写)
- 内存泄漏问题
- 线程的状态
- NEW 线程创建
- RUNNABLE 线程运行
- BLOCKING 线程阻塞
- WAITTING 线程等待
- TIME_WAITTING 线程等待(限时)
- TERMINATED 线程终止
- 图示
- 什么是上下文切换
- 任务从保存到记加载的过程就是一次上下文切换
- 当前任务的执行完成之后,CPU时间片切换到其他任务之前,记录自己的状态,以便下次任务切换回来,可以继续加载当前任务的状态
- 线程数>CPU核心数 CPU采用给线程分配时间片并轮询的方式
- 什么是线程死锁,怎么避免死锁
- 线程死锁
多个线程同时阻塞,一个或者多个线程都在等待某一个资源被释放 - 避免线程的方法
- 破坏互斥条件:无法实现,同步即互斥
- 破坏请求和保持条件:一次性请求任务执行所需要的所有资源
- 破幻不剥夺条件:占用部分资源的线程进一步申请其他资源时候,如果申请不到,则释放该资源占用的所有的资源
- 破幻循环等待条件:按特定顺序申请资源
- 线程死锁
- 说一说sleep()方法与wait()方法的区别和共同点
- 共同点
- 区别
- 共同点
- 为什么调用start()方法会执行run()方法而不直接调用run()方法