java多线程:3、sleep()、wait()、notify()、notifyAll()、run()、start()之间的区别?

1、sleep()、wait()的区别

sleep():线程指定睡眠时间,进入睡眠状态。会主动让出CPU,经过指定的时间后,进入就绪状态,等待CPU分配到本线程继续执行。在这个过程中,是不会释放锁的。(抱着对象睡觉,不释放锁)

wait():中断线程的运行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。会释放锁。只有当其他线程调用了notify()、notifyAll()方法,已经wait的线程才会正式加入获得锁的竞争,但是并不是立刻获取锁,要等待锁被释放之后才可以获得锁。

2、notify()、notifyAll()的区别

要理解notify()、notifyAll()的区别,首先要理解锁池和等待池。

锁池: 只有获取了对象的锁,线程才能执行对象的 synchronized 代码,对象的锁每次只有一个线程可以获得,其他线程只能在锁池中等待

等待池: 假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池,等待池中的线程不会去竞争该对象的锁。

notify(): 随机唤醒对象的等待池中的一个线程,进入锁池。

notifyAll(): 唤醒对象的等待池中的所有线程,进入锁池。

所以说唤醒线程,就是将线程由等待池移动到锁池,notifyAll调用后,会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执行,如果不成功则留在锁池等待锁被释放后再次参与竞争。而notify只会唤醒一个线程。

那么为什么wait()、notify()会造成死锁呢?
我还不知道,知道了来补充。

3、run()、start()的区别

通常,系统通过调用线程类的start()方法启动一个线程,此时线程处于就绪状态。只有当线程被CPU之后,会自动调用自身的run()方法进入运行状态,当run()方法结束之后,线程进入死亡状态。

如果直接调用线程的run()方法,会被视为普通的函数调用,并不能开启一个新的线程。直接调用run()方法是同步的,无法达到多线程的目的,而start()方法能够异步调用run()方法,才能实现多线程。

发布了57 篇原创文章 · 获赞 13 · 访问量 1097

猜你喜欢

转载自blog.csdn.net/weixin_42924812/article/details/105209868