1. 概念:
程序:一段静态代码,是应用软件执行的蓝本。
进程:是程序的一次动态执行,对应从代码的加载,执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程。
线程:是比进程更小的单位,一个进程在执行过程中,可以产生多个线程,形成多条执行线索,每个线程都有它自身的产生、存在和消亡的过程,是一个动态概念。
多线程:同时存在几个执行体,按几条不同的执行线索共同工作的情况。这可能会给人一种错觉:几个事件同时发生。但是不要忘了:任意时刻只能执行其中一个线程。
进一步了解线程和进程:操作系统采用分时管理各个进程,按时间片轮流执行每个进程。JAVA的多线程就是操作系统每次分时给JAVA程序一个时间片的CPU时间内,在若干个可独立控制的线程之间切换。若计算机有多个处理器,若JVM能充分利用这些CPU,那么程序在同一时刻就能获得多个时间片,程序就可以获得真实的同步线程执行效果。
每个进程都有一段专用的内存区域。与此不同的是线程间可以共享相同的内存单元,包括代码和数据,并充分利用这些共享单元实现数据交换、实时通信和必要的同步操作。
Java总是从main方法入口执行程序,这就启动一个线程,称为主线程,主线程中可以创建其他线程。如果Main方法中没有其它线程,当main方法返回时,JVM就结束JAVA程序;当MAIN方法中有其它线程时,那么JVM就要在主线程和其它线程间轮流切换。保证每个线程都能机会使用CPU资源,mian方法即使执行完最后一句,JVM也不会结束该程序,一直等到主线程中所有线程都结束后,才结束该JAVA应用程序。
2. 线程的状态和生命周期
a) 新建
当一个thread类或其子类的对象被声明并创建时,新生的线程线程对象处于新建状态。此时它有了相应的内存空间和资源,并被初始化
b) 就绪
处于新建状态的线程被启动,进入线程队列排队等候CPU时间片,此时它已经具备运行条件,一旦轮到它享有cpu资源时,就可以脱离创建它的主线程独立开始自己的生命周期。另外,原来处于阻塞状态的线程被解除阻塞后也进入就绪状态。
c) 运行
d) 中断
原因:
1, JVM将CPU资源从当前线程切换到其它线程
2, 执行了sleep(int millsecond)方法,使当前线程进入休眠状态
3, 使用CPU资源期间执行了wait()方法,进入等待状态,
4, 运行期间执行某些操作,如读/写引起阻塞,
e) 死亡
原因:
1, 完成了全部工作
2, 提前强制性中止
创建线程:
1, 继承thread类
可以扩展thread类,但要重写run()方法。
优点:可以在子类中增加新的成员变量,使线程具有某种属性,也可以在子类中新增加方法但不能扩展其它类。
2, Runable接口
用Thread类直接创建线程对象,使用构造方法thread(Runnable o),参数为Runnable类型接口,strat()执行后,一旦享有CPU资源,目标对象会自动调用接口中的run()方法(接口回调),这一过程自动实现,用户只要让它线程调用start()方法即可。Runnable接口只有一个方法run(),它比较特殊,由系统自动识别和执行。
优点:线程间可共享相同的内存单元,并利用这些共享单元实现数据交换,实时通信和必要的同步操作,轮到Thread()构造方法创建的线程享有CPU时,目标对象就会自动调用接口中的run()方法。因此,对于使用同一对象的线程,目标对象的成员变量自然就是这些线程共享的数据单元。另外创建目标对象的类在必要时还可以是某个特定类的子类,因此使用Runnable接口比使用Thread类更具有灵活性。