线程和进程的基础知识入门三部曲-1

170 阅读4分钟
本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

进程

一个进程就是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对象。