1.1 程序、进程与线程
程序:程序以静态的代码,如源程序、目标程序。
进程:进程是程序的一次动态的执行过程。平时我们在Windows任务管理器里就可以看到系统进程。
线程:线程是比进程更小的执行单位。 每个Java进程都有一个主线程。从main()开始,由Java虚拟机创建。其它线程由主线程创建。
1.2 线程调度与优先级
线程的优先级是按照线程的重要性来分的,因为在多个线程执行过程中,会出现多个线程同时想占用同一个资源的情况,如果不用优先级来约束这些线程,机器将处于死锁状态,即谁都想要这个资源,但谁都得不到。这就相当于我们平时说的退一步海阔天空是一个道理。
我们可以通过调用 Thread 类的方法getPriority()和setPriority()来获得和设置线程的优先级,线程的优先级界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之间,缺省是5(NORM_PRIORITY)。
1.3 线程的状态与生命周期
l 新状态:线程已被创建但尚未执行(start()尚未被调用)。
l 可执行状态:线程可以执行,虽然不一定正在执行。CPU 时间随时可能被分配给该线程,从而使得它执行。
l 运行状态:得到CPU资源,正在执行。
l 阻塞状态:线程没有被分配 CPU 时间,无法执行;可能阻塞于I/O,或者阻塞于同步锁。
l 死亡状态:正常情况下run()返回使得线程死亡。调用 stop()或 destroy()也有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。
一个线程的生命周期分为生成、运行、等待、终止等阶段,各阶段及状态间的转换条件具体如图所示:
1.4 控制一个线程生命周期最常用的方法:
(1)start():线程调用该方法启动一个线程,使之从新建状态进入就绪队列,一旦获得CPU就可以脱离创建它的主线程独立开始自己的生命周期。
(2)run():线程的所有活动都是通过线程体run()方法定义,并实现线程对象被调用之后所执行的操作。
(3) stop():为强制终止某个线程的执行,Thread类提供了线程最后一个控制即停止方法stop()。
(4) suspend():在Java语言程序中经常需要挂起一个线程而不指定多少时间,此时可用Thread类提供的suspend()方法,这个方法并不永久地停止线程。
(5) resume():暂停的线程可以重新激活,重新激活的方法为resume()方法。由于suspend()包含了对象锁,所以它使线程极易出现死锁现象,即被锁住的对象在永久地等待resume()方法,对暂停的线程不能使用start()方法重新启动该线程。
(6) isAlive():一个线程已经启动而且没有停止则被认为是激活的,可通过测试线程来判断线程是否被激活。测试方法为isAlive(),如果isAlive()方法返回true,则该线程是激活的。
(7) sleep():Java语言Thread类中提供的sleep()方法是简单地告诉线程休息多少个毫秒的时间,如果想要推迟一个线程的执行,则可以使用sleep()方法。当线程睡眠的时候,sleep()方法并不占用系统资源,其他的线程仍然可以继续工作。一旦延迟时间完毕,则该休眠线程就被激活。sleep()方法的基本调用形式采用一个以毫秒为单位的参数,它使线程暂停一段规定的延时时间。当延时完成后,线程则继续工作。由于Java运行系统采用了线程调度机制,所以通过在run()的主循环中插入对sleep()的调用,一般都可以使Java语言程序运行得更快一些。因为在正在运行的线程准备进入休眠状态之前,较短的延迟可能造成sleep()结束调度机制的中断,强迫调度机制将其中止,并于稍后重新启动,以便该线程能做完它自己的事情,再进入休眠状态。
(8)wait()和notify():当编写的Java语言程序被分成几个逻辑线程时,需要清晰地知道这些线程之间应怎样相互通讯。例如网络数据交换程序经常需要使用Sleep()、Wait()、Suspend()等方法使一个线程进入等待状态,同时需要另一个线程使用Notify()、Resume()等方法将等待线程激活。
Java免费学习 Java自学网 http://www.javalearns.com
关注微信号:javalearns 随时随地学Java
或扫一扫
随时随地学Java