程序、进程、线程区别
概念:
程序:程序是指令和数据的有序集合,是一个静态的概念。
进程:进程是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位。可以将运行在内存中的exe文件理解为进程,进程是受操作系统管理的基本运行单元。
线程:线程可以理解成在进程中独立运行的子任务。比如QQ.exe运行时,就有很多子任务同时运行。每一项任务可以理解成“线程”在工作,这样做的优势是最大限度地利用CPU的空闲时间来处理其他任务。
总结:
在操作系统中运行的程序就是进程,比如微信、游戏、IDE等等。一个进程可以有多个线程,如视频中可以同时听声音、看图像、看弹幕等等。
线程的状态
1.NEW表示线程创建成功,在new Thread之后,没有start之前,线程的状态都是NEW;
2.RUNNABLE表示线程正在运行中,运行start方法,子线程被创建成功,子线程的状态变为RUNNABLE;
3.TERMINATED表示线程已经运行结束了,子线程运行完成、被打断、被中止,状态都会从RUNNABLE变为TERMINATED;
4.BLOCKED表示阻塞的意思,如果线程正好在等待获得monitor lock锁,比如在等待进入synchronized修饰的代码块或方法时,会从RUNNABLE变成BLOCKED;
5.WAITING和TIMED_WAITING相似,表示在遇到Object.wait、Thread.join、LockSupport.park这些方法时,线程会等待另一个线程执行完特定的动作之后,才能结束等待,区别是TIMED_WAITING是带有等待时间的。
这6种状态并不是线程的全部状态,不过Java线程的处理方法都是围绕这6种状态的。很多属性,子线程都是直接继承父线程的,包括优先性、守护线程、inheritableThreadLocals 里面的值等等。
线程操作
1.线程停止—stop()
要点:
(1)不推荐JDK提供的stop()、destroy()方法;
(2)推荐线程自己停止下来;
(3)建议使用一个标志位进行终止变量,当flag=false,则终止线程运行。
案例:
public class TestStop implements Runnable{
//1.设置一个标志位
private boolean flag = true;
@Override
public void run() {
int i = 0;
while (flag){
System.out.println("Thread is running......");
}
}
//让线程停止
public void stop(){
this.flag = false;
System.out.println("线程结束........");
}
public static void main(String[] args) {
TestStop testStop = new TestStop();
for (int i = 0;i < 2000;i ++){
System.out.println("main is running......" + i);
if(i == 1888){
testStop.