java---生命周期

来源:互联网 发布:网络招聘启事 编辑:程序博客网 时间:2024/05/30 12:30

生命周期:

一个事物从出生的那一刻开始到最终死亡中间的整个过程。在事物的漫长的生命周期过程中,总会经历不同的状态。线程也是生命周期的,也是存在着不同的状态之间的转换的。

线程对象的状态存放在Thread类的内部类State中:

注意:Thread.state类其实是一个枚举类,因为线程对象的状态是固定的,只有6种,此时使用枚举来表示是最恰当的。


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

状态:

1.新建状态:

使用 new 创建一个线程对象,仅仅在堆中分配内存空间,在调用start方法之前。新建状态下,线程压根没有启动,仅仅存在一个线程对象而已。
Thread t = new Thread () ;
线程对象的start方法只能调用一次。

2.可运行状态:

分成两种状态,分别为就绪状态和运行状态
就绪状态:线程对象调用 start 方法之后,等待JVM的调度
运行状态:线程对象获得JVM调度,如果存在多个CPU,那么允许多个线程并行运行。

3.阻塞状态:

正在运行的线程因为某些原因放弃CPU,暂时停止运行,就会进入阻塞状态。此时JVM不会给线程分配CPU,直到线程重新进入就绪状态,才有机会转到运行状态。阻塞状态只能先进入就绪状态,不能直接进入运行状态。
1.当线程A出于运行过程时,试图获取同步锁时,却被B线程获取,此时JVM把当前A线程保存到对象的锁池中,A线程进入阻塞状态。
2.当线程出于运行状态时,发出了IO请求,此时进入了阻塞状态

4.等待状态(只能被其他线程唤醒):

1.当线程出于运行过程时,调用了wait()方法,此时JVM把当前线程存在对象等待池中,

5.计时等待状态:

1.当线程出于运行过程时,调用了wait(time)方法,此时JVM把当前线程存在对象等待池中。
2.当前线程执行了sleep(time)方法

6.终止状态:

1.正常执行完run方法而退出
2.遇到异常的时候而退出

void  suspend();  暂停当前线程 
void  resume();  恢复当前线程
void  stop(); 结束当前线程

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

线程休眠:

目的:让执行的线程暂停一段时间,进入计时等待状态
方法:static void sleep(long milis);
调用sleep后,当前线程放弃CPU,在指定时间段之内,sleep所在线程不会获得执行的机会。此状态下的线程不会释放同步锁或者同步监听器

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

联合线程:day06 j03

线程的join方法表示一个线程等待另一个线程完成后才执行。join方法调用之后,线程对象处于阻塞状态。有人也把这种方法称为联合线程,就是说当前线程和当前线程所在的线程联合成一个线程

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

后台线程:

在后台运行的线程,其目的是为其他线程提供服务,也成为守护线程,JVM的垃圾回收线程就是典型的后台线程。
特点:若所有的前台线程都死亡,后台线程自动死亡,前台线程没有结束,后台线程是不会结束的,测试线程是不是后台线程:使用Thread.isDaemon()。

前台线程创建的线程默认是前台线程,可以通过setDaemon(true) 方法设置为后台线程,并且当且仅当后台线程创建的新线程时,新线程是后台线程。
设置后台线程:thread.setDaemon(true)。该方法必须在start方法调用前,否则出现异常


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

线程优先级:day06 j05

每个线程都有优先级,优先级的高低只和线程获得执行机会的次数多少有关,并非线程优先级越高就的就一定先去执行,那个线程先运行取决于CPU的调度。
MAX_PROIRITY =10 最高优先级
MIN_PROIRITY = 1 最低优先级
NORM_PROITY = 5 默认优先级

每个线程都有默认优先级,主线程默认优先级为5,如果A线程创建了B线程,那么B线程和A线程的优先级相同。
注意:不同的操作系统支持的优先级不同,建议使用上述三个优先级,不要自定义

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

线程礼让:day06 j06

yield方法:表示当前线程对象提示:调度器自己愿意让出CPU资源,但是调度器可以自由的忽略该提示。
调用该方法之后:线程对象进入就绪状态,所以完全有可能:某一个线程调用了yield方法之后,线程调度器又把它调度出来重新执行,
从java7提供的文档上可以清楚的看出来,开发中很少使用

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Timer类:day06 j07

目的:可以定时执行特定的任务
TimerTask类表示定时器执行的某一项任务:
常用方法 schedule()

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ThreadGroup类表示线程组:

目的:可以对一组线程进行集中管理。
用户在创建线程对象时,可以通过构造器指定其所属的线程组
Thread(ThreadGroup group , String name)
如果线程A创建了线程B,如果没有设置B线程的分组,那么B线程就加入了A线程的线程组。
一旦线程加入了某个线程组,该线程就一直存在于该线程组中直到线程死亡,不能在中途修改分组

原创粉丝点击