总结线程常用方法

目录

一、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():获得当前线程的优先级。

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

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

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Java中,创建多线程有几种常用方法。其中一种方法是继承Thread类并重写其run()方法。通过创建一个继承自Thread类的子类,并在子类中重写run()方法来定义线程的执行逻辑。然后可以通过创建该子类的实例并调用start()方法来启动线程。例如,可以创建一个名为TestThread的类,继承自Thread类,并在其run()方法中定义线程的执行逻辑。然后可以创建TestThread的实例,并调用start()方法来启动线程。\[1\] 另一种常用方法是实现Runnable接口。通过创建一个实现了Runnable接口的类,并实现其run()方法来定义线程的执行逻辑。然后可以创建该类的实例,并将其作为参数传递给Thread类的构造函数。最后,调用Thread类的start()方法来启动线程。例如,可以创建一个名为TestRunnable的类,实现了Runnable接口,并在其run()方法中定义线程的执行逻辑。然后可以创建TestRunnable的实例,并将其作为参数传递给Thread类的构造函数,最后调用start()方法来启动线程。\[2\] 此外,还可以使用Lambda表达式来创建Runnable线程目标类。通过使用Lambda表达式,可以更简洁地定义线程的执行逻辑。例如,可以使用Lambda表达式创建一个匿名的Runnable实例,并在其中定义线程的执行逻辑。然后可以将该实例作为参数传递给Thread类的构造函数,并调用start()方法来启动线程。\[3\]这种方法可以减少代码的冗余,并提高代码的可读性。 总结起来,Java常用多线程方法包括继承Thread类并重写run()方法、实现Runnable接口并实现run()方法,以及使用Lambda表达式创建Runnable线程目标类。这些方法都可以用来定义线程的执行逻辑,并通过调用start()方法来启动线程。 #### 引用[.reference_title] - *1* *2* [java中实现多线程的三种方式](https://blog.csdn.net/Mao_yafeng/article/details/126089335)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Java多线程之四种方法创建线程](https://blog.csdn.net/liu320yj/article/details/125703535)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值