课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在上文中给大家简单介绍了java编程中的线程与多线程问题,而今天我们就一起来了解一下,java编程线程同步与调度方法。
一、关于线程同步以及线程调度的相关方法
(1)wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
(2)sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;
(3)notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;
(4)notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;
二、sleep和wait的区别
我们都知道的是对于sleep和wait都是会让线程出现暂停执行的状态,下面从几个方面进行剖析个体区别
对于sleep()方法,我们先要知道该方法是属于Thread类中的。而wait()方法,则是属于
Object类中的。
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然
保持者,当指定的时间到了又会自动恢复运行状态。
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此
对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
使用的位置不同:对于wait来说使用之前要获取到锁的存在,所以必须放在同步代码,或者同步块中进行执行但是sleep来说可以放在任何的地方执行。
sleep需要捕获异常。waitnotify等不需要这些。
三、sleep和yield的区别
(1)sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
(2)线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
(3)sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
(4)sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性,通常不建议使用yield()方法来控制并发线程的执行。
四、start和run的区别
start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,
可以直接继续执行下面的代码。
通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运
行。对于多线程来说只有真正意义上调用了start方法才算是对于线程的一个启动。
方法run()称为线程体,它包含了要执行的这个线程的内容,线程就进入了运行状态,开始运
行run函数当中的代码。Run方法运行结束,此线程终止。然后CPU再调度其它线程。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。