1.进程与线程
代码的运行必须要获得cup等资源的的使用权。
进程:早起的计算机,同时只能运行一个程序,系统运行效率、资源利用率都较低。为此引入了多道程序的技术,使程序能够并发执行。对可以并发执行的程序加以描述和控制,引入了“进程”的概念。进程由PCB,程序段,相关数据段构成。
进程的状态:创建、就绪<活动就绪、静止就绪(就绪状态被挂起)>、执行、阻塞<活动阻塞,静止阻塞(阻塞状态被挂起)>、终止。
os内核对进程的操作(原语):创建、终止、阻塞(阻塞、唤醒)、挂起(挂起、激活)。
由于进程间需要相互协调工作、对资源互斥访问等,需要同步机制。软件同步机制<较少使用>硬件同步机制<关中断、TS指令、XCHG指令>、信号量机制、管程机制等。可见进程的管理、调度等是操作系统层面的。
线程:在但处理机环境下,进程一直作为拥有资源和独立调度的基本单位。随着多处理机系统的推出,OS引入了线程。进程的创建、切换需要分配较多资源、保存较多的cpu状态,开销较大。线程不拥有独立的资源<仅少量自己的必要资源>,作为独立调度的基本单位,创建和切换开销较进程小。
内核支持线程:可以直接接受调度。
用户级线程:有用户管理,接受调度时仍以进程为单位。
组合方式:多(用户)对一(内核),一对一,多对多。
jvm在windows下的线程是内核支持线程,在Linux下是一对一模式。
线程中断:结束线程的某种状态。
isInterrupted()返回中断状态。<false未中断;阻塞状态调用该方法会抛出InterruptedException异常>
interrupted()静态方法,返回中断状态,并将终端状态设为false;
interrupt() 中断请求,中断状态设为true,若sleep,抛出异常。
getState()获得线程当前状态<New,Runnable,Blocked,Waiting,Time waiting,Terminated>
不同状态会进入不同的队列,等待调度<改变状态>。
线程同步:
ReentrantLock:
lock(),unlock()没有锁的被阻塞
tryLock()尝试获得锁,不阻塞。
条件对象:
Condition =ReentrantLock.newCondition()
Condition.await()当前线程阻塞,放弃锁
Condition .signalAll()激活因为当前条件阻塞的线程,接着await()之后开始执行
推荐使用:while(条件) Condition.await();
Synchronized:
wait()线程进入阻塞。
notifyAll()激活阻塞的线程。
当发生死锁时,程序将被挂起。
其他实现同步的方法:使用阻塞队列 |
|