线程一共有5大状态。如图:
其中阻塞的方式有:
等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

线程状态的具体形成条件为:

这里着重说明造成阻塞状态的方法。
-
sleep():静态方法
使线程休眠一段时间,将处于阻塞状态;
休眠时间结束,就会进入就绪状态;
每一个对象都有一个锁,sleep不会释放锁;
-
join ():实例方法
合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞。
通常用于在main()主线程内,等待其它线程完成再结束main()主线程,不会放弃锁资源。
-
yield ():静态方法
让当前正在执行线程暂停,不是阻塞线程,而是将线程转入就绪状态;
-
wait():
使线程挂起,进入等待阻塞;
直到通过 notify() 或 notifyAll()唤醒,进入就绪状态;
属于Object类方法。
线程其他的一些方法:
-
setDaemon():
可以将指定的线程设置成后台线程即守护线程;
守护线程(deamon)是程序运行时在后台提供服务的线程,并不属于程序中不可或缺的部分。
当所有非后台线程结束时,程序也就终止,同时会杀死所有后台线程;
虚拟机不用等待守护线程执行完毕;
只能在线程启动之前把它设为后台线程;
-
setPriority(int newPriority):
设置线程执行的优先级;
优先级低只是意味着获得调度的概率低。并不是绝对先调用优先级高后调用优先级低的线程。;
范围从1到10,默认为5;
优先级的设定建议在start()调用前;
-
stop():
停止线程,不推荐使用;
而是提供一个boolean型的终止变量,当这个变量置为false,则 run()方法完成后线程终止。
关注公众号,可以免费获取毕业设计项目、各种免费软件、资料,笔记哦。

![]()
![]()
![]()
866

被折叠的 条评论
为什么被折叠?



