Java线程唤醒与阻塞的常用方法
如果线程是因为调用了wait()、sleep()或者join()方法而导致的阻塞,可以中断线程,并且通过抛出InterruptedException来唤醒它;如果线程遇到了IO阻塞,无能为力,因为IO是操作系统实现的,Java代码并没有办法直接接触到操作系统。以下是详细的唤醒方法:
1. sleep() 方法
sleep(毫秒),指定以毫秒为单位的时间,使线程在该时间内进入线程阻塞状态,期间得不到cpu的时间片,等到时间过去了,线程重新进入可执行状态。(暂停线程,不会释放锁)
2.suspend() 和 resume() 方法:。
挂起和唤醒线程,suspend e()使线程进入阻塞状态,只有对应的resume e()被调用的时候,线程才会进入可执行状态。(不建议用,容易发生死锁)
3. yield() 方法:
会使得线程放弃当前分得的cpu时间片,但此时线程仍然处于可执行状态,随时可以再次分得cpu时间片。yield()方法只能使同优先级的线程有执行的机会。调用 yield()的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。(暂停当前正在执行的线程,并执行其他线程,且让出的时间不可知)
4.wait() 和 notify() 方法
两个方法搭配使用,wait()使线程进入阻塞状态,调用notify()时,线程进入可执行状态。wait()内可加或不加参数,加参数时是以毫秒为单位,当到了指定时间或调用notify()方法时,进入可执行状态。(属于Object类,而不属于Thread类,wait()会先释放锁住的对象,然后再执行等待的动作。由于wait()所等待的对象必须先锁住,因此,它只能用在同步化程序段或者同步化方法内,否则,会抛出异常IllegalMonitorStateException.)
5.join()方法
也叫线程加入。是当前线程A调用另一个线程B的join()方法,当前线程转A入阻塞状态,直到线程B运行结束,线程A才由阻塞状态转为可执行状态。
以上是Java线程唤醒和阻塞的五种常用方法,不同的方法有不同的特点,其中wait() 和 notify()是其中功能最强大、使用最灵活的方法,但这也导致了它们效率较低、较容易出错的特性,因此,在实际应用中应灵活运用各种方法,以达到期望的目的与效果!
如需了解更多测试技术信息请关注:深圳多测师软件与技术服务有限公司
相关文章
- Java实现 LeetCode 726 原子的数量(递归+HashMap处理)
- Java实现 LeetCode 100 相同的树
- Java实现 蓝桥杯 算法训练 景点游览
- Java实现蓝桥杯VIP 算法训练 sign函数
- java写入文件的几种方法小结
- Java单链表的实现方法汇总整理
- 使用Java 线程池的利弊及JDK自带六种创建线程池的方法
- java 11 Java Flight Recorder
- 为什么Java中只有值传递?
- Java SimpleDateFormat 线程不安全问题及解决方法
- Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216 java c# php js.docx
- List中subList方法抛出异常java.util.ConcurrentModificationException原理分析
- 【java】为什么 main 方法是 public static void ?
- 基于JAVA实现的WEB端UI自动化 - WebDriver框架篇 - ant使用 - ant发送邮件显示源码的解决方法
- Java面试题之常见十五种异常有哪些?
- Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法
- java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- 1.java线程的源码解析和两种线程创建方法
- java中集合类中Collection接口中的Set接口的常用方法熟悉
- Java豆瓣电影爬虫——模拟登录的前世今生与验证码的爱恨情仇
- Java:openjdk: error: Student is abstract; cannot be instantiated;java编译环境
- JUC学习之Java 线程常用方法
- 《SQL必知必会》拾遗 原创 Django Java工程师成长日记
- ZZNUOJ_用Java编写程序实现1599:真值(附源码)
- 【java】Java并发编程--Java实现多线程的4种方式