Java线程基础wait()、join()、sleep() 和 yield()
1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
3. 阻塞(BLOCKED):表示线程阻塞于锁。
4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
6. 终止(TERMINATED):表示该线程已经执行完毕。
wait()、join()、sleep() 和 yield() 总结
wait:暂停当前线程,让出cpu,释放锁。(Object类)
join:暂停当前线程,执行该线程之后才能回到自身的线程运行。(Thread类)
主要起同步作用,使线程之间的执行从“并行”变成“串行”。线程A中调用了线程B的join()方法时,线程执行过程发生改变:线程A必须等待线程B执行完后,才可以继续执行自己的线程。
sleep:暂停当前线程,让出cpu,不释放锁。(Thread类)
yield:暂停当前线程,但是不能由用户制定,只能让同优先级有执行机会。(Thread类)
wait和sleep的区别
wait():让出CPU资源和锁资源。
sleep(long mills):让出CPU资源,但是不会释放锁资源。
wait,notify,notifyall 都是 Object 对象的方法,是一起使用的,用于锁机制,所以会释放锁;
sleep是Thread类,跟锁没关系,不会释放锁,但是两者都会让出cpu资源。
阻塞状态和等待状态的区别
线程进入阻塞状态是被动的, 而线程进入等待状态是主动的。
在进入synchronized方法之前因为抢不到锁对象而进入阻塞状态,进入阻塞队列。
进入到synchronized方法后由于调用了wait()方法而进入等待状态,此时进入等待队列,等待其它线程调用它的notify()方法将他唤醒。