1.过程和线程
1.过程
过程就是正在运行的程序,它代表了程序所占用的内存区域
2.过程的特点
1).独立性
过程是零碎中独立存在的实体,它能够领有本人独立的资源,每个过程都领有本人公有的地址空间,在没有通过过程自身容许的状况下,一个用户过程不能够间接拜访其余过程的地址空间
2).动态性
过程与程序的区别在于,程序只是一个动态的指令汇合,而过程是一个正在零碎中流动的指令汇合,程序退出了工夫的概念当前,称为过程,具备本人的生命周期和各种不同的状态,这些概念都是程序所不具备的.
3).并发性
多个过程能够在单个处理器CPU上并发执行,多个过程之间不会相互影响.
3.线程
线程是操作系统OS可能进行运算调度的最小单位,它被蕴含在过程之中,是过程中的理论运作单位.
一个过程能够开启多个线程,其中有一个主线程来调用本过程中的其余线程
咱们看到的过程的切换,切换的也是不同过程的主线程
多线程扩大了多过程的概念,使的同一个过程能够同时并发解决多个工作
4.过程和线程的关系
一个操作系统中能够有多个过程,一个过程中能够蕴含一个线程(单线程程序),也能够蕴含多
每个线程在共享同一个过程中的内存的同时,又有本人独立的内存空间.
所以想应用线程技术,得先有过程,过程的创立是OS操作系统来创立的,个别都是C或者C++实现
5.线程的状态
1.线程的五态模型
1).创立状态:线程的创立比较复杂,须要先申请PCB,而后为该线程运行调配必须的资源,并将该线程转为就绪状态插入到就绪队列中
2).就绪(可运行)状态:线程曾经筹备好运行,只有取得CPU,就可立刻执行
3).执行(运行)状态:线程曾经取得CPU,其程序正在运行的状态
4).阻塞状态:正在运行的线程因为某些事件(I/O申请等)临时无奈执行的状态,即线程执行阻塞
5).终止状态:期待OS进行善后处理,最初将PCB清零,并将PCB返回给零碎
就绪 → 执行:为就绪线程调配CPU即可变为执行状态. 执行 → 就绪:正在执行的线程因为工夫片用完被剥夺CPU暂停执行,就变为就 绪状态. 执行 → 阻塞:因为产生某事件,使正在执行的线程碰壁,无奈执行,则由执行 变为阻塞. (例如线程正在拜访临界资源,而资源正在被其余线程拜访) 反之,如果取得了之前须要的资源,则由阻塞变为就绪状态,期待调配CPU再次 执行.
2.线程状态与代码对照
线程生命周期,次要有五种状态:
1).新建状态(New) : 当线程对象创立后就进入了新建状态.如:Thread t = new MyThread();
2).就绪状态(Runnable):当调用线程对象的start()办法,线程即为进入就绪状态.
处于就绪(可运行)状态的线程,只是阐明线程曾经做好筹备,随时期待CPU调度执行,并不是执行了t.start()此线程立刻就会执行
3).运行状态(Running):当CPU调度了处于就绪状态的线程时,此线程才是真正的执行,即进入到运行状态.就绪状态是进入运行状态的惟一入口,也就是线程想要进入运行状态状态执行,先得处于就绪状态
4).阻塞状态(Blocked):处于运状态中的线程因为某种原因,临时放弃对CPU的使用权,进行执行,此时进入阻塞状态,直到其进入就绪状态才有机会被CPU选中再次执行.
*依据阻塞状态产生的起因不同,阻塞状态又能够细分成三种:
---期待阻塞:运行状态中的线程执行wait()办法,本线程进入到期待阻塞状态
---同步阻塞:线程在获取synchronized同步锁失败(因为锁被其余线程占用),它会进入同步阻塞状态
---其余阻塞:调用线程的sleep()或者join()或收回了I/O申请时,线程会进入到阻塞状态.当sleep()状态超时.join()期待线程终止或者超时或者I/O处理完毕时线程从新转入就绪状态
5).死亡状态(Dead):线程执行完了或者因异样退出了run()办法,该线程完结生命周期
6.你晓得的线程的办法?
1.join():合并以后线程相当于办法的调用
2.yield():让出CPU
3.wait():使一个线程处于期待状态,并且开释所持有的对象lock
4.sleep():是线程类Thread办法,导致线程暂停,而后给定工夫,让出cpu给其余线程,然而不会开释对象锁,工夫到了复原。
5.notify():唤醒一个处于期待状态的线程,留神这里不是给所有唤醒线程一个对象的锁 而是让他们竞争。