进程和线程的区别
从操作系统方面来看
早期计算机串行执行任务,需要长时间等待用户的输入,效率是很低下的.
之后的计算机执行批处理,预先将用户的指令集中起来,批量串行用户指令,但是仍然无法并发访问
到后来的计算机采用进程的概念,进程独占内存空间,保存各自运行状态,各个进程之间互不干扰,为并发处理提供了可能,出现了进程之后,操作系统的性能得到了大幅度的提升,虽然能够并发访问,但是人们对实时性有了更高的追求,因为i一个进程在一段时间内只做一件事情,如果一个进程有多个子任务,只能逐个的执行这些子任务,而往往子任务之间不存在顺序上的依赖,是可以并发执行的.所以线程的概念应运而生.
线程共享进程的内存资源,相互间切换更快速,让线程执行每一个子任务,这样进程内的子任务可以并发执行,达到了实时性.
进程是资源分配的最小单位,所有与该进程有关的资源,都被记录在进程控制块PCB中,进程也是抢占处理机的调度单位,
线程是CPU调度的最小单位,线程属于某个进程,与其他线程共享进程里面的资源.
进程可以看作是一个独立的应用,线程不能看作独立应用
进程有独立的地址空间,相互不影响,线程只是进程的不同执行路径
线程没有独立地址空间
进程切换比线程切换开销大
从Java语言本身看,
运行每一个Java程序会产生一个进程,进程包含至少一个线程,一个进程对应着一个JVM实例,多个线程共享JVM里面的堆,每一个线程都有一个自己私有的栈
Java采用的单线程编程模型,程序会主动创建主线程.
Java也可以使用重写run方法来编写多个线程.
Thread中的Start和run方法有什么区别?
- 调用start()方法会创建一个新的子线程并启动,它的底层是一个非Java语言实现的.start()方法会先创建一个JVM_StartThread(),然后由这个方法去创建一个新的子线程,并通过这个子线程去调用run方法.
- 调用run()方法只是Thread的一个普通方法的调用,还是在主线程里面执行
Thread和Runnable方法区别?
- Thread它是一个类,Runnable是一个接口.Thread实现了Runnable接口
- 因为Java的单一继承原则,推荐使用Runnable接口
线程的状态
- 新建New,创建线程之后但是未启动
- 运行Runnable,包含Running和Ready
- 无限等待Waiting,不会被分配CPU执行,需要被显示的唤醒
- 限期等待Time Waiting,在一定实践后由系统自动唤醒
- 阻塞Blocked,等待获取排他锁
- 结束Terminated,已终止线程的状态,线程已经结束执行
sleep() 和 wait() 的区别?
- sleep()是Thread类的方法,只会让出CPU,不会导致锁行为的改变;wait是Object类中定义的方法,他会让出CPU,还会释放已经占有的同步资源锁,以便让那些等待该资源的线程得到该资源
- sleep() 方法可以在任何地方使用,而 wait() 方法则只能在同步方法或同步块中使用;
notify和notifyAll的区别?
- 锁池
- 等待池
- notifyAll会让所有处于等待池的线程全部进入锁池去竞争获取多的机会
- notify只会随机选取一个处于等待吃中的线程进入锁池去竞争获取锁的机会.
yield方法了解吗?
- yield方法会让出当前线程的CPU,但是调度器可能会忽略.就是随机的.