并发
某个时间段内,多任务交替处理的能力。
并行
同时处理多任务的能力
临界区用来表示一种公共资源(或者说共享资源),可以被多个线程使用。但是每次只能有一次线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源就必须等待资源被释放。在并发程序中,临界区资源是被保护的对象。
线程
- 线程是CPU调度和分派的基本单位,作用是提高任务的平均处理速度。
- 线程拥有自己的操作栈、程序计数器、局部变量表等资源,与同一进程内的其他线程共享该进程的所有资源。
- 多线程可能造成的问题:占用内存、资源竞争产生死锁。
- 合适的线程数才能让CPU资源被充分利用。
线程的生命周期(五种状态)
1.NEW:新建状态,线程被创建尚未启动的状态
- 三种创建方式
2.RUNNABLE:就绪状态,调用start()之后运行之前的状态
- 线程的start()不能被多次调用
3.RUNNING:运行状态,是run()正在执行时线程的状态
- 线程可能会由于某个因素而退出RUNNING,如时间、异常、锁、调度等
4.BLOCKING:阻塞状态,进入此状态,有以下几种情况
- 同步阻塞:锁被其他线程占用
- 主动阻塞:调用Thread的某些方法,主动让出CPU执行权,比如sleep()、join()等
- 等待阻塞:执行了wait()
5.DEAD:终止状态,是run()执行结束,或因异常退出后的状态,此状态不可逆转
创建线程(启动线程)的三种(两种)方式/怎么创建线程
1.继承Thread类重写run()方法
- 劣势:往往不符合里氏代换原则。不推荐
- 劣势:任务执行完成后,无法直接获取执行结果,需要借助共享变量等获取
2.实现Runnable接口
- 优势:可以是编程更加灵活,对暴露的细节比较少,让使用者专注于实现线程的run()方法上。
- 劣势:任务执行完成后,无法直接获取执行结果,需要借助共享变量等获取
- 劣势:只有通过setDefaultUncaughtException()的方式才能在主线程中捕捉到子程序异常
3.实现Callable接口
- 可以通过call()获得返回值。Callable和Future很好的解决了这个问题,可以获得执行结果
- call()可以抛出异常
Thead类中的方法
Runnable接口和Callable接口的区别
线程池原理,线程池与直接启动线程的比较
二、什么是锁
你知道Java中有哪些锁
三、线程同步
四、线程池
五、ThreadLocal