1.如何理解进程与线程安全?
进程:操作系统进行资源调度和分配的基本单位(列入浏览器,app,jvm)
线程:进程中的最小执行单位(可以理解为一个顺序的执行流)。多个线程可以共享所属进程的所有资源。
2.如何理解多线程中的并行与并发
并发:多线程抢占cpu,不能同时执行,侧重于多个任务交替执行。
对于cpu来说,同一时间只可以干一件事情。为了实现同时多件是,分时操作将cpu划分位长短基本相同的时间片,通过操作系统的管理,把时间片依次轮流分配给各个线程任务使用,我们看似同时干多件事情,其实是通过cpu时间片技术并发完成的
并行:线程可以不共享cpu,可每个线程一个cpu同时执行多个任务
总之:并行只出现在多个cpu或多核cpu,并发是并行的一个子集
线程一与线程二 并发
线程一内部的处理1,处理2,处理3 并行
线程的生命周期及状态变化(5种线程状态+3种阻塞状态)
创建:新建进程,计算机为该线程分配对应的资源空间,并将线程转到就绪队列
就绪:排队等待cpu分配时间片的状态
执行:cpu分配了对应的时间片,运行。时间片结束转会就绪状态,如果发生了阻塞,无法执行,将转为阻塞状态
阻塞(3):因为某种原因处于运行的线程,放弃了cpu的使用权,只有阻塞解决了之后才会转为就绪状态重新排队等待
- 其他阻塞:调用线程的sleep(),join()或发出IO请求(主动引发的阻塞)
- 同步阻塞:调用公共资源时,该资源被锁定(被其他程序占用),转为阻塞状态
- 等待阻塞:运行状态的线程执行wait()方法,进入等待阻塞
终止:线程已经执行完或者异常退出了,该线程生命周期结束
实列
该测试中包含两个线程。main方法的主线程和定义的 Thread t子线程
在实际运行中,如果先执行完了main方法的主线程,子线程没有执行,content没有被赋值,主线程的输出内容为空的content。会造成空指针异常
解决方法:
1.为主线程添加Thread.sleep(1000),主动让主线程休眠1000ms,给予足够的时间去调用子线程。缺点:会造成资源的浪费,也许子线程执行不需要1000ms,就会造成pc资源的浪费
2.加入t.join,主动让子线程 t 线程先执行。缺点:会直接将t线程全部执行完,执行完才会执行主线程。无法只要执行content赋值的语句,其他的部分不可以稍后执行。
3.加入while(true)