多线程常用方法的学习
方法
sleep
sleep()方法会让当前线程从RUNNING进入Timed Watting阻塞状态。
interrupt() 方法,由其他线程调用,将被调用的线程从Thread.sleep()方法中唤醒过来,将会抛出InterruptedException异常
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
log.debug("running");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
log.debug("wake up");
e.printStackTrace();
}
}, "t1");
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.interrupt();
}
案例
防止while(true){}在单核CPU上资源占用100%的问题。可以使用sleep方法线程进入睡眠让CPU出来解决资源占用问题。
使用场景:在无需锁同步的场景下使用
Thread.sleep(1);
yield
yield()方法即让出该线程的使用权,将线程从运行状态转换为就绪状态,让操作系统重新分配CPU使用权
优先级即给任务调度器只是一个提示的作用,并不能实质上控制任务调度器分配CPU资源
thread.setPriority(Thread.MAX_PRIORITY); // 设置线程优先级
thread.setPriority(Thread.MIN_PRIORITY);
join
join()方法即当前线程等待调用该join方法的线程执行结束才能继续运行
同步等待线程结束(同步即等待线程结束才继续执行当前线程)
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
},"t1");
Thread t2 = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
},"t2");
t1.start();
t2.start();
log.debug("start");
t1.join();
log.debug("t1 join");
t2.join();
log.debug("t2 join");
}
同步限时等待(即在当前限时间内即参数1500毫秒没有得到响应就继续执行下一步,提前得到响应会立刻继续执行)
t1.join(1500);
interrupt
interrupt()当调用线程的interrupt()打断方法时,会将其打断阻塞状态置为true。
Thread.currentThread().isInterrupted() // 获取当前的打断状态Boolean值
Thread.interrupted() // 获取当前打断状态并恢复为true
案例
可以使用该方法优雅的让线程结束
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
while (true){
boolean interrupted = Thread.currentThread().isInterrupted();
if (interrupted){
log.debug("程序被告知要结束了");
break;
}
}
},"t1");
t1.start();
log.debug("通知打断");
Thread.sleep(1000);
t1.interrupt();
}
不推荐使用方法
stop() 方法,直接停止线程运行,直接导致后果就是锁资源不能被释放,会导致死锁。
suspend() 方法 挂起(暂停)线程
resume() 恢复线程运行
守护线程
守护线程跟随主线程的生命周期,主线程结束,守护线程也会跟着结束
垃圾回收器就是守护线程,跟随主线程。
线程状态
操作系统的五种状态:准备、就绪、运行、阻塞、结束
Java层面的六种状态:
public enum State {
NEW, // 创建没有运行
RUNNABLE, // 运行
BLOCKED, // 请求获得锁
WAITING, // join
TIMED_WAITING, // sleep
TERMINATED; // 运行结束
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律