进程、程序与线程

线程

线程是一个比进程更小的执行单位,一个进程在其执行的过程中可以产生多个线程,在同一个进程内,各个线程共享着同一块内存空间和同一组系统资源,线程的上下文切换也要比进程要小

程序

程序是含有指令和数据的文件,被存储在磁盘或者其它数据存储设备中,程序是静态的代码。

进程

进程是系统运行程序的基本单位,是动态的,是程序的一次执行过程。
系统运行一个程序是一个进程从创建、运行到消亡的过程。简单来说, 一个进程就相当于一个执行中的程序,它在计算机中一个指令接着另一个指令地执行着, 同时每个进程还会占有某些系统资源如CPU时间、内存空间、文件、输入输出设备等等, 换句话说,当程序在执行时,程序会被操作系统载入内存中,。

JAVA线程状态

image.png

Daemon线程

Daemon线程是一种支持型线程,因为它主要被用作程序中后台调度以及支持工作,当一个JAVA虚拟机中不存在非Daemon线程的时候,JAVA虚拟机将会退出。

可以使用Thread.setDaemon(true)来设置Daemon线程。

Deamon线程被用作支持性工作,但是在JAVA虚拟机退出时,Daemo线程中的finally块不一定会执行。

对象、监视器、同步队列和执行线程之间的关系

image.png

线程间的通信

等待/通知机制

image.png

有一些细节上的东西需要注意一下:

  • 使用wait、notify、notifyAll时需要对调用对象加锁。
  • 调用wait方法后,线程状态由RUNNING变成WAITING,并将当前线程放置在对象的等待队列中。
  • notify和notifyAll调用后,等到线程依旧不会从wait返回,而是要等本线程释放锁之后,等待线程才有机会返回
  • notify是将等待队列中的一个等待线程从等待队列中移到同步队列中
  • notifyAll是将等待队列中所有的线程全部移到同步队列中,被移动的线程状态由WAITING变为BLOKCED
  • 从wait方法返回后重新执行的前提是获得对象的锁

本文标题:进程、程序与线程

文章作者:Enda Lin

发布时间:2019年05月31日 - 10:42

最后更新:2019年07月08日 - 09:15

原始链接:https://wt-git-repository.github.io/2019/05/31/进程、程序与线程/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。