25 线程状态
新生状态 Thread t = new Thread()
就绪状态 当调用start()方法
运行状态 进入运行状态,线程才真正执行线程体的代码块
阻塞状态 当调用sleep,wait或同步锁定时,线程进入阻塞状态
死亡状态 线程中断或者结束,进入死亡状态,就不能再次启动
线程方法
setPriority(int newPriority)
更改线程的优先级
static void sleep(long millis)
在指定的毫秒数内让当前正在执行的线程体休眠
void join()
等待线程终止
static void yield()
暂停当前正在执行的线程对象,并执行其他线程
void interrupt()
中断线程,别用这个方式
bollean isAlive()
测试线程是否处于活动状态
停止线程
不推荐使用jdk提供的stop(),destory()方法
推荐线程自己停止下来
建议使用一个标志位进行终止变量 当flag = false 则终止线程运行
//测试停止线程
//1.建议线程正常停止---> 利用次数,不建议死循环
//2.建议使用标志位----> 设置一个标志位
//3.不要使用stop或者destory等过时或者jdk不建议使用的方法
public class TestStop implements Runnable{
//1.设置一个标识符
private boolean flag = true;
线程休眠
sleep(时间)指定当前线程阻塞的毫秒数
sleep存在异常需要抛出
时间达到后线程进入就绪状态
可以模拟网络延时,倒计时等
每一个对象都有一个锁,sleep不会释放锁
public class TestSleep2 {
public static void main(String[] args) {
//打印当前系统时间
Date startTime = new Date(System.currentTimeMillis());//获取系统当前时间
while(true){
try {
Thread.sleep(1000);
System.out.println(new SimpleDateFormat("HH:mm::ss").format(startTime));
startTime = new Date(System.currentTimeMillis());//更新当前时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//模拟倒计时
public static void tenDown() throws InterruptedException {
int num = 10;
while(true){
Thread.sleep(1000);
System.out.println(num--);
if(num <= 0){
break;
}
}
}
}
线程礼让
yield,让当前正在执行的线程暂停,但不阻塞
将线程从运行状态转为就绪状态
让cpu重新调度,礼让不一定成功,看cpu心情
//测试礼让线程
//礼让不一定成功,看cpu心情
public class TestYield {
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread(myYield,"a").start();
new Thread(myYield,"b").start();
}
}
class MyYield implements Runnable{
线程强制执行
join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞
可以想象成插队
//测试join
//想象成插队
public class TestJoin implements Runnable{
线程中断或者结束,一旦进入死亡状态,就不能再次启动
//观察测试线程的状态
public class TestState {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(10000);//调用sleep后线程进入阻塞状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("///////////");
});
//观察状态
Thread.State state = thread.getState();
System.out.println(state);//new
//观察启动后
thread.start();//启动线程
state = thread.getState();
System.out.println(state);//run
while(state != Thread.State.TERMINATED){//只要线程不终止,就一直输出状态
Thread.sleep(1000);
state = thread.getState();//更新线程状态
System.out.println(state);
}
}
}
线程的优先级
java提供了一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行
线程的优先级用数字来表示,范围从1~10
使用以下方式改变或获取优先级
getPriority()
setPriority(int xxx)
优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用了。这都是看CPU的调度
优先级的设定建议在start()调度前
//测试线程的优先级
public class TestPriority {
public static void main(String[] args) {
//主线程默认优先级
System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());
MyPriority myPriority = new MyPriority();
Thread t1 = new Thread(myPriority);
Thread t2 = new Thread(myPriority);
Thread t3 = new Thread(myPriority);
Thread t4 = new Thread(myPriority);
Thread t5 = new Thread(myPriority);
Thread t6 = new Thread(myPriority);
//先设置优先级
t1.start();
t2.setPriority(1);
t2.start();
t3.setPriority(4);
t3.start();
t4.setPriority(Thread.MAX_PRIORITY);//MAX_PRIORITY
t4.start();
// t5.setPriority(-1);
// t5.start();
//
// t6.setPriority(11);
// t6.start();
}
}
class MyPriority implements Runnable{
守护线程
线程分为用户线程和守护线程
虚拟机必须确保用户现场执行完毕
虚拟机不用等待守护线程执行完毕
如,后台记录操作日志,监控内存,垃圾回收
public class TestDaemon {
public static void main(String[] args) {
God god = new God();
My my = new My();
Thread thread = new Thread(god);
thread.setDaemon(true);//默认是false 表示是用户线程,正常线程都是用户线程
thread.start();//守护程序
new Thread(my).start();//用户程序
}
}
class God implements Runnable{
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)