本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
进程
一个进程就是CPU执行的单个任务的过程,是程序在执行过程中CPU资源分配的最小单位,并且进程有自己的地址空间,包含了运行态,就绪态,阻塞态,创建态,终止态五个状态。
线程
线程是CPU调度的最小单位,它可以和属于同一进程的其他线程共享这个进程的全部资源。
主要区别
- 进程是主机资源分配的最小单位,线程是主机调度的最小单位。
- 进程之间的切换开销比较大,但是线程之间的切换开销比较小。(进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段、数据段。这种操作非常昂贵,而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费比进程小很多,同时创建一个线程的开销也比进程小很多)
- 一个进程包含多个线程,但是一个线程只能在一个进程中。
- 多线程程序中只要有一个线程死掉,整个进程也就死掉了,而一个进程的死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
CPU核心数和线程的关系
一个核心最少对应一个线程,通过超线程技术,一个核心可以对应两个线程。
CPU时间片轮转机制
也叫RR调度。 基本思想就是系统将所有进程按照先来先服务的原则,排成一个队列,系统把处理机分配给队列的首进程,并让其执行一个时间片。当一个时间片用完时,由一个计时器发起时钟中断请求,调度程序根据这个请求停止该进程的运行,并将其送到就绪队列的末尾。再把处理及分配给就绪队列的首进程,同时让他也执行一个时间片。经过周密的时间分配,宏观上就像多个任务并列进行一样,但微观上是有先后的,这就是时间片轮转。
并行和并发
- 并行:把每个任务分给每个处理器独立完成,在同一时间点,任务一定是同时进行。
- 并发:把任务在不同的时间点交给处理器去完成,在同一时间点,任务并不会同时进行;并发一般是指多个事件在同一时间间隔内完成。
高并发编程的意义、好处和注意事项
- 多线程并发可以充分利用CPU的资源。
- 加快响应用户的时间。
- 注意事项:线程的安全性(共享资源的争夺);线程数量的限制(windows 单进程2000)
Java里的程序天生就是多线程
Java有几种新启线程的方式
- 类Thread
- 接口Runnable
Thread和Runnable的区别
- Thread是Java对线程的抽象,一般都复杂的线程操作需求,就继承Thread实现;Runnable是对任务的抽象,假如只是简单的执行一个任务,就实现Runnable接口。
线程stop的不安全性
stop方法不建议使用,因为它可能导致线程所占用的资源不会正常的释放。
推荐使用interrupt。 JDK的线程是协作式的,而不是抢占式的。interrupt是通知线程终止,而不是强制终止。
start()和run()方法
start()仅允许调用一次,再次调用会抛出异常。开启子线程执行任务。
run()方法可以被反复调用。直接调用run方法是无法启动子线程执行,而是在主线程执行。
join()方法
当有新的线程加入时,主线程会进入等待状态,一直到调用join()方法的线程执行结束为止。
线程的优先级和守护线程
线程的优先级:1-10.默认值:5
守护线程:支持型线程,做一些内存调度、内存回收等工作。在一个进程中,当用户线程执行完毕后,所有的守护线程将跟着停止。
synchronized
内置锁。可以对方法加锁,也可以对同步块加锁。
对象锁
类锁 static 本质还是对象锁,对象是class对象。