程序:
程序是一个指令序列,是一段静态的代码,是应用软件执行的蓝本
进程:是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个
过程也是进程本身从产生、发展至消亡的过程
程序是静态的,进程就是执行程序的一次性过程。相当于一整条高速公路。
一个进程可以包含多个线程,当然,最少有一个线程,不然这个进程毫无意义。
线程:
是比进程更小的执行单位。进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线
索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念,线程相当于独立的
执行路径,相当于高速公路的每一条车道。
在程序执行中,即使你没有创建线程,也会有默认的线程,如:main,gc等。
main() 函数 被称为主线程,是整个程序的入口。
在一个线程当中,如果有多个进程,具体的调度是无法人为干预的,是由cpu来调度的。
多个线程对同一个资源进行操作时,可能会发生错误,需要加入并发控制。
主线程:(每个Java程序都有一个默认的主线程)
当JVM加载代码发现main方法之后,就会立即启动一个线程,这个线程称为主线程
注意:主线程不一定是最后完成执行的线程,各个线程运行时完全独立,争夺cpu,很可能主线程
执行完了,子进程没有。
单线程:如果main方法中没有创建其他的线程,那么当main方法执行完最后一个语句,JVM就会
结束Java应用程序
多线程:如果main方法中又创建了其他线程,那么JVM就要在主线程和其他线程之间轮流切换,
JVM要等程序中所有线程都结束之后才结束程序。
多线程的优势:
减轻编写交互频繁、涉及面多的程序的困难
程序的吞吐量会得到改善
由多个处理器的系统,可以并发运行不同的线程
“同时”执行是人的感觉,在线程之间实际上轮换执行
线程生命周期(五个状态):新建、就绪、运行、阻塞、死亡
新建状态:线程对象已经创建,还没有在其上调用start()方法
就绪状态:当线程调用start方法,但调度程序还没有把它选定为运行线程时线程
运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。(是线程进
入运行状态的唯一方式)
阻塞(等待/睡眠)状态:线程仍旧是活的,但是当前没有条件运行。当某件事件出现,他可能返回到
可运行状态
死亡状态:当线程的run()方法完成时就认为它死去。线程一旦死亡,就不能复生。 一个死去的线
程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常