![](https://i-blog.csdnimg.cn/blog_migrate/949e94937e4db64afebc5b696edf0ce8.png)
常用方法,会导致状态变化:
start,创建一个线程,调用start方法开始分配内存空间,所有的线程都从start开始,start()不能执行两次
什么时候线程开始运行,不由JVM,java代码控制,它是由OS决定的。
Run,运行状态会调用业务方法。Thread.run().如果是自己去调用线程run方法,这个线程就废了,它就不是线程了,它变成了普通类的方法。必须交给JVM,OS去管理,Run方法执行完成,线程就结束,释放资源。
Yield()特殊,它会把运行状态线程,强制退回到就绪状态,代码主动调用。主动把CPU让出来,让其他线程去执行。资源同时利用,工作分配更加均匀。
sleep()延时,他会把CPU让出来,先阻塞等着,sleep(1000);阻塞1s中,然后变成就绪状态。
Yield和sleep区别,yield立即进入就绪状态,sleep要阻塞一会,自己设置,等延长时间过去1000ms,然后才进入就绪状态。
join,执行join操作,运行快的所有线程都等待,直到最慢的那个线程执行完成,会把它们的结果统计计算,算完后,所有线程结束。
wait 等待,特殊线程优先级,线程参数可以设置线程优先级共10个级别,数字越小,级别越高,默认线程级别数为5,
notify 通知,也称为唤醒。
interrupt 中断,之前停止它,让它继续执行一般抛异常,
sychronized(this){} 关键字,同步,同步锁,代码快,多行代码被枷锁。互斥,独占,其他线程就不能执行,阻塞,等待。原子性操作。一次执行,成功,如果失败,回滚。全部回退。别的线程不能访问,就不能干扰,就不会造成线程安全问题。
五种状态:
1.new 新建:分配内存空间,初始化。
2.runnable 就绪:人工执行代码线程方法start().CPU它要调用线程时,只能线程先在就绪的状态.等到CPU轮询到该线程,才会拥有CPU资源
3.running 运行:调用线程业务功能,run()、call()等。
第一种情况:业务非常短小,执行很快,如果刚好在CPU轮询分配的时间片内完成,结束dead,释放资源。
第二种情况:业务执行时间非常长,超过CPU分配的轮询时间片,此时当前线程就被挂起wait(),它就让出资源,CPU去执行其他线程。等到CPU轮询回来,再次执行恢复现场。继续执行。在这次时间片内执行完成,进入终止状态。
特殊情况:
程序主动让出CPU,故意暂时让出CPU,为了并发执行,让其他线程也有执行的机会。
加锁,当前线程独占资源,其他线程进入阻塞状态,等着重新执行。当前线程执行完成,就把锁释放了,此时另外一个线程就得到资源,就进入就绪状态。CPU不是立即执行而是轮询到它才执行。
Dead 终止。