线程
线程是一个比进程更小的执行单位,一个进程在其执行的过程中可以产生多个线程,在同一个进程内,各个线程共享着同一块内存空间和同一组系统资源,线程的上下文切换也要比进程要小
程序
程序是含有指令和数据的文件,被存储在磁盘或者其它数据存储设备中,程序是静态的代码。
进程
进程是系统运行程序的基本单位,是动态的,是程序的一次执行过程。
系统运行一个程序是一个进程从创建、运行到消亡的过程。简单来说, 一个进程就相当于一个执行中的程序,它在计算机中一个指令接着另一个指令地执行着, 同时每个进程还会占有某些系统资源如CPU时间、内存空间、文件、输入输出设备等等, 换句话说,当程序在执行时,程序会被操作系统载入内存中,。
JAVA线程状态
Daemon线程
Daemon线程是一种支持型线程,因为它主要被用作程序中后台调度以及支持工作,当一个JAVA虚拟机中不存在非Daemon线程的时候,JAVA虚拟机将会退出。
可以使用Thread.setDaemon(true)来设置Daemon线程。
Deamon线程被用作支持性工作,但是在JAVA虚拟机退出时,Daemo线程中的finally块不一定会执行。
对象、监视器、同步队列和执行线程之间的关系
线程间的通信
等待/通知机制
有一些细节上的东西需要注意一下:
- 使用wait、notify、notifyAll时需要对调用对象加锁。
- 调用wait方法后,线程状态由RUNNING变成WAITING,并将当前线程放置在对象的等待队列中。
- notify和notifyAll调用后,等到线程依旧不会从wait返回,而是要等本线程释放锁之后,等待线程才有机会返回
- notify是将等待队列中的一个等待线程从等待队列中移到同步队列中
- notifyAll是将等待队列中所有的线程全部移到同步队列中,被移动的线程状态由WAITING变为BLOKCED
- 从wait方法返回后重新执行的前提是获得对象的锁