程序、进程和线程
Java语言的一大特点就是内置对多线程的支持。要学习线程先对程序和进程进行相关的了解。
程序是一段静态的代码。
进程是程序的一次完整的动态执行过程,是程序进行加载、执行到执行完毕的过程,可以联想到生命的产生、存在到死亡的过程。现在的计算机操作系统可以同时管理多个进程,多个进程也可以共享操作系统所管理的资源。
线程是比进程更小的执行单位,一个进程可以产生若干个线程。线程本身也具有产生、存在和死亡的过程。与进程共享操作系统资源类似,线程也可以共享其进程的资源。
线程
线程可以看作是程序的进程中的一个小进程。多线程就是一个程序执行时同时存在多个执行体。使得程序猿能够开发出有多线程功能,能够同时处理多个任务的应用程序。
计算机处理多线程程序,咋一看很厉害的,但是计算机在任一时刻都只能执行其中的某一个线程,每个线程都会有使用cpu的机会,速度快到想不到。
- 主线程: 也叫main线程,当JVM(java虚拟机)加载代码,发现main方法后自动启动一个线程,即主线程;
- 其他线程: main方法执行时再创建的线程;
JVM要在主线程和其他线程之间不断切换,保证每个线程都有机会使用CPU资源
Java程序一定时当所有的线程都结束之后再结束Java程序
如果机器有多个CPU,JVM可以充分利用这些来打造真实并发的执行效果
线程的状态和生命周期
- 新建: Thread类或他的子类对象被声明时,新生线程对象处于新建状态,有相应的内存空间和其他资源
- 运行: 新的线程调用start()方法进行排队,当轮到它获得CPU资源时,该线程就脱离创建它的主线程有自己的生命周期
- 中断: 4种中断原因:
1:CPU使用权被抢。气愤型
2:使用sleep(int millsecond)方法让出使用权,millsecond毫秒数,指定时间过后重新排队,从中断处继续运行。有事型
3:使用wait()方法进入等待状态,不会主动排队等资源,需要其他线程调用notify()方法通知他,他才排队,从中断处处理。傲娇型
4:执行某个操作引发阻塞,只有当阻塞处理了之后线程才能排队等资源。无奈型 - **死亡:**不具有运行能力,释放分配给线程对象的内存。有正常死亡和非正常死亡两种,正常死亡即执行完run()方法中语句,非正常死亡即强制run()方法结束
线程优先级
在同一时刻,排队的线程可能有多个,JVM中的线程调度器负责管理线程。调度器把其优先级分为10个级别,用Thread类常量代表,
例Thread.MIN_PRIORITY最小优先级1,Thread.MAX_PRIORITY最大优先级10,未定义优先级为常数Thread.NORM_PRIORITY为5。
可以通过setPriority(int grade)方法设置优先级,参数必须在1-10之间,否则产生IllegalArgumenException异常。
有些操作系统只认识1、5、10三个级别。
在采用时间片的系统中,每个线程都有机会获得使用权执行操作,时间过后该线程停止等待下一次CPU的使用权,完成其中断之后的操作。
JVM的线程调动器保证高优先级线程能够始终运行,有时间片空闲,具有相同优先级的线程一轮流方式使用时间片。