一、进程:
定义:
进程是具有一定功能的程序在一个数据集合上的运行过程,它是系统进行资源分配和调度管理的一个可并发执行的基本单位。
理解:
1、每个进程拥有独立的代码和数据空间。
2、程序的一次执行,切换的开销大。
特征:
1、动态性(最大的特性):系统创建、调度执行、申请资源被阻塞、完成任务后被撤销。
2、异步性:进程由于使用资源的原因,在管理上使用异步的方式使用处理器和资源。
3、独立性:为了并发。
4、结构特征:一个进程实体有程序、数据和一个PCB(进程控制块构成)
状态转换:
二、线程:
定义:
线程是进程中实施和分派的基本单位。
分类:
用户级线程和核心级线程
特点:
独立调度、抢占式的执行、并发执行、共享进程的资源、切换开销小。
线程池:
创建一个进程的时候,同时创建多个线程,放入缓冲池中,这些线程等待工作,服务器接收到请求时
唤醒一个线程,并将请求交给它,任务完后重新放入线程池中。线程池中如果没有可用的线程,那么服务器就等待直到有线程被释放。
线程状态:
线程创建:
1、public class ThreadCreate extends Thread{
public void run(){
for(int i=0;i<50;i++){
System.out.println("Thread"+i);//循环50次
}
}
}
ThreadCreate threadCreate=new ThreadCreate();//创建一个线程了
2、public class RunnableCreate implements Runnable{
public void run(){
for(int i=0;i<50;i++){
System.out.println("Thread"+i);//循环50次
}
}
}
RunnableCreate runnableCreate=new RunnableCreate ();
Thread rThread=new Thread(runnableCreate); //创建一个线程
常用的方法:
1、wait():Object方法、notify\notifyAll、释放资源,sleep():Thread类的静态方法、不释放资源。
2、interrupt():切换异常。
3、join():合并线程。当前线程阻塞时,被调用的线程执行。
4、yield():让出cpu资源。
线程同步:
synchronized
1、每个对象都有一个互斥锁、使用synchronized方法后,每个对象自能被一个线程访问。
死锁问题:
1、产生条件(四个必要条件):
互斥:资源被一个线程占用其他线程不能占用
不可剥夺:不能强抢资源,只能能拥有资源的线程释放资源。
请求保持:资源请求者在请求其他资源受阻时,对已经获得的资源不释放,持续占有。
循环等待:P1占有P2资源,P2占有P3资源,P3又占有P1资源。
2、解决死锁:
打破四个条件的任意一个
线程交互:
1、wait(),notify():
线程调度:
抢占式、高优先级、分时间片、先来先服务。
getPriority()、setPriority()、1-10数字越大优先级越高。
优先级高只是获得处理器资源的机会多并不一定先执行。
三、线程及进程区别:
1、根本区别:
进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。
2、开销方面:
每个进程都有独立的代码和数据空间,程序之间的切换会有较大的开销。
线程可以看作是轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间的切换开销小。
3、所处环境:
在操作系统中能够同时运行多个进程,在同一进程中能够有多个线程同时运行(CPU调度,每个时间片只有一个线程执行)
4、内存分配:
系统在运行的时候为每个进程分配不同的内存空间,而线程除了CPU,系统是不会在给其分配内存的,那它使用的就是其所属的进程的资源,线程组之间只能共享资源。
5、包含关系:
没有线程的进程可以看成是单线程的、如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线程共同完成的,线程是进程的一部分,所以线程也被称为轻权进程或轻量级进程。