Java中的线程

来源:互联网 发布:linux ping 测试 带宽 编辑:程序博客网 时间:2024/05/18 20:08
**一 程序、进程与线程的区别**程序是一段静态代码。进程是程序的一次动态执行的过程。它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。线程是比进程更小的执行单位。一个进程在执行的过程中可以产生多个线程,形成多条执行线索,每条线索即每个线程都有它自身的产生、存在和消亡的过程,也是一个动态概念。每个进程都有一段专用的内存区域但线程之间可以**共享相同的内存单元**(包括代码和数据),并利用这些共享内存单元来实现数据交换、实时通信与必要的同步操作。每个Java程序都有一个默认的主线程。我们知道,Java应用程序总是从主类的main方法开始执行。当JVM加载代码时,发现main方法之后,会启动一个线程,这个线程称为主线程,该线程负责执行main方法。若在主线程中又创建了其他线程,那么JVM就要在主线程和其它线程之间**轮流切换**,以保证每个线程都有机会使用CPU资源,main方法即使执行完最后一行语句(主线程结束),JVM也不会结束程序,而是等到程序中的所有线程都结束之后才结束Java应用程序。

二 线程的状态与生命周期
Java语言使用Thread类及其子类的对象来表示线程,新建的线程在它的一个完整的生命周期中通常要经历以下4中状态。
1.新建
当一个Thread类或其子类的对象被声明并创建时,新的线程对象处于新建状态。此时它已经有了相应的内存空间和其它资源。
2.运行
线程在创建之后就具备了运行的条件,一旦轮到它来享用CPU资源,即JVM将CPU使用权切换给该线程时,此线程就可以脱离创建它的主线程独立开始自己的生命周期了。
线程创建后仅仅是占有了内存资源,在JVM管理的线程中还没有这个线程,此线程必须调用start()方法通知JVM,这样JVM就能知道又有一个新的线程排队等候切换了。
当JVm将CPU的使用权切换给线程时,如果线程是Thread的子类创建的,该类中的run()方法会立即执行。所以在子类中必须重写父类的run方法。
在线程没有结束run方法之前,不要让线程再次调用start方法,否则将发生ILLegalThreadStateException异常。

3.中断
在Java中,有4种原因的中断
(1)JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU使用权处于中断状态。
(2)线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状态。 sleep(int millsecond)方法是Thread类中的一个类方法,线程一旦执行了sleep(int millsecond)方法,就会立刻让出CPU的使用权,使当前线程处于中断状态。经过参数 millsecond 指定的毫秒数之后,该线程会重新进到线程队列中排队等待CPU资源,以便从中断处继续运行。
(3) 线程使用CPU资源期间,执行了wait()方法,使得当前线程进入等待状态。等待的线程不会主动进到线程队列中排队等待CPU资源,必须由其他线程调用notify()方法通知它,使得它重新进到线程队列中排队等待CPU资源。以便从中断处继续运行。
(4) 线程使用CPU资源期间,执行某个操作进入阻塞状态,比如执行读、写操作引起阻塞。进入阻塞状态时线程不能进入排队队列,只有当引起阻塞的原因消除时,线程才能重新进到线程队列中排队等待CPU资源,以便从原来中断处继续运行。
4.死亡
处于死亡状态的线程不再具有继续运行的能力。线程死亡的 原因有两个:一个是正常运行的线程完成了它的工作,即执行完了run方法。二是线程被提前强制性的终止,即强制run方法结束。线程死亡之后,它所占有的资源就会全部被释放。

0 0
原创粉丝点击