总结线程常用方法

目录

一、join方法

二、interrupt方法

三、currentThread方法

四、isAlive方法

五、setDaemon方法

六、其它方法

七、终止线程——无疾而终

八、终止线程——暴毙身亡


一、join方法

join方法:执行该方法的线程进入阻塞状态直到调用该方法的线程结束后再由阻塞转为就绪状态

注意:
线程对象在调用join方法前必须先调用start方法否则该线程永远不会进入执行状态

二、interrupt方法

interrupt方法:结束线程在调用Object类的wait方法该类的join方法sleep方法过程中的阻塞状态,并在调用wait、join和sleep方法处产生InterruptedException异常。

理论上beforeTime和afterTime应该相差30秒,但因为该线程类的对象在1秒后执行了interrupt方法而使得该线程对象提前结束了阻塞状态,从而导致了beforeTime和afterTime相差少于30秒

当线程执行该行代码后,线程进入阻塞状态;但由于10秒后主线程执行了“counterThread.interrupt();”代码使得该线程阻塞状态结束。

计数器线程执行timeThread.join后进入阻塞状态,时间线程至少需要消耗30秒才能结束,而15秒后计数器线程调用了interrupt方法致使该计数器线程提前结束阻塞状态。

三、currentThread方法

currentThread方法:返回当前正在执行的线程对象。

四、isAlive方法

isAlive方法:判定该线程是否处于就绪、运行或阻塞状态,如果是则返回true,否则返回false。

线程A执行“已死”线程B所调用的jion方法,则线程A不会阻塞。

五、setDaemon方法

setDaemon方法:用于将一个尚未调用线程start方法的线程设置为守护线程。守护线程主要用于为其他线程的运行提供服务(Java中的垃圾回收机制就是守护线程),这种线程属于创建它的线程。
注意:
1、守护线程随着最后一个非守护线程的终止而终止,如下代码:

主线程结束,但是因为timeThread非守护线程没有立即结束,所以countThread守护线程运行了一段时间;timeThread非守护线程结束后,由于进程中没有其他非守护线程在运行,所以countThread守护线程也停止了运行,尽管countThread守护线程run方法是死循环。

2、进程中所启动的其他非守护线程不会随着某一个非守护线程的结束而结束,如下代码:

一个时段后“任务管理器”中javaw.exe进程中少一条线程(时间线程),但计数器线程依然在工作

3、进程随着最后一个非守护线程的结束而结束,如下代码:

说明:运行上面程序,进程随着时间线程(非守护线程)的结束而结束。


六、其它方法

void start():使该线程开始启动,Java 虚拟机负责调用该线程的 run() 方法。多次启动一个线程是非法的。
void sleep(long millis):Thread类静态方法,线程进入阻塞状态,在指定时间(单位为毫秒)到达之后进入就绪状态(Runnable),而非立即进入执行状态。
void yield():静态方法,当前线程放弃占用CPU资源回到就绪状态,使其他优先级不低于此线程的线程有机会被执行。
void setPriority(int newPriority):设置当前线程的优先级,线程优先级越高,线程获得执行的次数越多,Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:
1、static int MAX_PRIORITY   最高优先级值为10;
2、static int NORM_PRIORITY   默认优先级值为5;
3、static int MIN_PRIORITY   最低优先级值为1;
注意:同一个线程类创建的多个线程,线程优先级越高的线程获得的执行次数极有可能越多;但是不同线程类创建的线程,线程优先级越高,执行次数不一定越多,这个run方法的代码复杂度有关。
int getPriority():获得当前线程的优先级。

七、终止线程——无疾而终

八、终止线程——暴毙身亡

猜你喜欢

转载自blog.csdn.net/m0_46383618/article/details/113705106