多线程
- 常见概念:
-
-
-
-
- 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。
- 线程:同一线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。
- 线程和进程一样分为五个阶段:创建(刚new出来的线程)、就绪(线程一切都准备就绪,调用start方法)、运行(cpu执行线程,按顺序执行)、阻塞(线程在运行过程中遇到的不正常现象;例:死循环,流通道阻塞,阻塞状态线程会让出CPU,阻塞原因被解除后,重新进入就绪状态)、终止(死亡,线程正常运行结束时,一经终止不可复活,只能重新new)。
- 多线程是指操作系统能同时运行多个任务(程序),按顺序执行。
- 多线程是指在同一个程序中有多个顺序流在执行。
- 这个程序(一个进程)运行时产生了不止一个线程
- 并行与并发
- 并行:多个CPU实例或者多台机器同时执行一段处理逻辑,是真正的同时。
- 并发:通过CPU调度算法,让用户看上去同时执行,实际上从CPU操作层面不是真正的同时。并发往往在场景中有共用的资源,那么针对这个共用的资源往往会产生瓶颈,我们会用TPS和QPS来反应这个系统的处理能力。
- 阻塞情况分三种:
- 等待阻塞:运行的线程执行wait()方法,jvm会把该线程放入等待池中
- 同步阻塞:运行的线程在获取对象时的同步锁,若该同步锁被别的线程所占用,则JVM会把该线程放入到锁池中
- 其他阻塞:运行的线程sleep()或者join()方法。或者发出I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时时,join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态.
-
-
-
-
- 线程的生命周期
- 常用方法:
- Sleep(long milis):在指定的毫秒内让当前正在执行的线程休眠(暂停执行)。
- join();指等待t线程终止
- yield();暂停当前正在执行的现场能对象,并执行其他线程
- interrupt();中断某个线程,这种结束方法比较粗暴,如果t线程打开了某个资源还没有来得及关闭也就是run方法还没有执行完就强制结束线程,会导致资源无法关闭