线程与进程
进程
是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间
线程
是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个线程
线程实际上是在进程的基础上进一步划分的,一个进程启动后,里面的若干执行路径又可以划分成若干个线程
同步与异步&并发与并行
同步:排队执行,效率低但是数据安全
异步:同时执行,效率高但是数据不安全
并发:指两个或多个事件在同一个时间段内发生
并行:指两个或多个事件在同一时刻发生(同时发生)
实现Runnable
实现Runnable 与 继承Thread相比有以下优势:
1、通过创建任务的方式,给线程分配的方式来实现的多线程,更适合多个线程同时执行相同任务的情况
2、避免单继承的局限性
3、任务与线程本身是分离的,提高了程序的健壮性
4、后续学习的线程池技术,接受Runnable类型的任务,不接受Thread类型的线程
守护线程
线程:分为守护线程和用户线程
用户线程:当一个进程不包含任何的存活的用户线程时,用户进程结束
守护线程:守护用户线程,当最后一个用户线程结束时,所有守护线程自动死亡
线程安全
1、同步代码块
2、同步方法
3、显式锁Lock
多线程通信问题
生产者与消费者
生产者 休眠,唤醒消费者;消费者休眠,唤醒生产者。以此循环往复
线程的六种状态
1、New:线程刚被创建但还没有启动的状态
2、Runnable:运行时的状态
3、Blocked:被阻塞的状态
4、Waiting:无限等待的状态
5、Timed Waiting:计时等待一定时间后,恢复运行状态
6、Terminated:已退出的状态
带返回值的线程Callable
面试问题:Java里的第三种线程实现方式,Callable
线程池概述
线程的频繁创建和销毁需要消耗大量时间,所以使用线程池,线程池可以把许多线程放在一起重复利用,节省大量时间,提高了效率
四种类型:
1、缓存线程池:不定长,长度无限制,线程池满就扩容
2、定长线程池:定长,线程池满就等待
3、单线程线程池:空闲则使用,不空闲则等待
4、周期性任务定长线程池:定时执行,当某个时机触发时,自动执行某任务
Synchronized和Lock的区别
Synchronized | Lock | |
---|---|---|
出身不同 | Java中的关键字 | JDK5以后出现的类 |
使用方式不同 | 隐式锁,使用时不需要手动写代码 | 显式锁,需要手动写代码来使用 |
等待是否可以中断 | 不可中断,除非抛出或者正常运行结束 | 可以中断 |
加锁的时候是否可以公平 | 非公平锁(插队) | fair参数为true时为公平锁(排队) |