> 文章列表 > Java线程基础wait()、join()、sleep() 和 yield()

Java线程基础wait()、join()、sleep() 和 yield()

Java线程基础wait()、join()、sleep() 和 yield()

Java中线程状态分为6种:

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()方法将他唤醒。