Java线程中wait,await,sleep,yield,join用法总结.pdf
在Java编程中,多线程的使用是实现程序并发运行的重要手段。本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、notifyAll()用法 wait()、notify()和notifyAll()是Object类的方法,用于控制线程在特定条件下暂停执行和恢复执行。 - wait():当一个线程调用某个对象的wait()方法时,当前线程会释放对象锁,并进入该对象的等待队列。线程需要在同步环境下才能调用wait(),意味着调用它的对象必须被声明为synchronized。 - notify():当其他线程调用对象的notify()方法时,它会唤醒在此对象上等待的单个线程。需要注意的是,被唤醒的线程会继续等待,直到它获得对象锁。 - notifyAll():与notify()类似,但它会唤醒在此对象上等待的所有线程。 示例代码如下: ```java public class ThreadWaitNotify { public static void main(String[] args) throws InterruptedException { DemoTest demoTest = new DemoTest(); // 使用线程池异步执行waitTest方法 ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit(() -> demoTest.waitTest()); // 使用线程池异步执行notifyTest方法 executorService.submit(() -> demoTest.notifyTest()); } } static class DemoTest { public synchronized void notifyTest() { System.out.println("方法notifyTest开始执行了"); notify(); System.out.println("方法notifyTest执行结束了"); } public synchronized void waitTest() { System.out.println("方法waitTest开始执行了"); try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("方法waitTest执行结束了"); } } ``` 从上述示例中可以看出,waitTest方法会阻塞执行直到被notifyTest方法唤醒。 二、await()、signal()、signalAll()用法 await()、signal()和signalAll()是java.util.concurrent包下的Condition类的方法,它们也用于线程间的协调,但提供了比Object的wait()、notify()更为灵活的机制。 - await():使线程在Condition上等待,同时释放当前锁。可以指定等待时间。 - signal():唤醒在Condition上等待的单个线程。 - signalAll():唤醒在Condition上等待的所有线程。 示例代码如下: ```java public class ThreadAwaitSignal { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); DemoTest demoTest = new DemoTest(); // 使用线程池异步执行awaitTest方法 executorService.submit(() -> demoTest.awaitTest()); // 使用线程池异步执行signalTest方法 executorService.submit(() -> demoTest.signalTest()); } } static class DemoTest { private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); public void signalTest() { lock.lock(); try { System.out.println("方法signalTest开始执行了"); condition.signalAll(); System.out.println("方法signalTest执行结束了"); } finally { lock.unlock(); } } public void awaitTest() { lock.lock(); try { System.out.println("方法awaitTest开始执行了"); condition.await(); System.out.println("方法awaitTest执行结束了"); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } ``` 在这个例子中,awaitTest方法中的线程会因为调用了condition.await()而阻塞等待,直到signalTest方法中的线程调用condition.signalAll()后才能继续执行。 三、sleep()用法 sleep()是Thread类中的静态方法,当线程调用sleep(long millis)时,会让当前线程暂停执行指定的毫秒数。不过,线程在调用sleep时,并不会释放对象锁,它只是在指定的时间内停止运行而已。 四、yield()用法 yield()同样是Thread类中的静态方法,它的作用是建议当前线程让出CPU的执行权给其他线程。但需要注意的是,yield()只是提供一个建议,并不意味着立即停止当前线程的执行,是否要立即执行其他线程还是由线程调度器决定。 五、join()用法 join()方法是Thread类中的一个实例方法,当一个线程A执行了threadB.join()操作时,线程A会等待线程B执行完成后才继续执行。这通常用于需要等待子线程完成之后才继续执行的情况。 以上就是对Java线程中wait、await、sleep、yield、join用法的总结。这些方法在实际开发中,对于控制多线程运行的时序和协调非常关键。理解这些方法的正确使用方式是掌握Java并发编程的基础。同时,使用时需特别注意这些方法中隐含的线程安全问题和锁的释放机制,这直接关系到多线程程序运行的正确性和效率。
- 粉丝: 490
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 两相步进电机FOC矢量控制Simulink仿真模型 1.采用针对两相步进电机的SVPWM控制算法,实现FOC矢量控制,DQ轴解耦控制~ 2.转速电流双闭环控制,电流环采用PI控制,转速环分别采用PI和
- VMware虚拟机USB驱动
- Halcon手眼标定简介(1)
- (175128050)c&c++课程设计-图书管理系统
- 视频美学多任务学习中PyTorch的多回归实现-含代码及解释
- 基于ssh员工管理系统
- 5G SRM815模组原理框图.jpg
- T型3电平逆变器,lcl滤波器滤波器参数计算,半导体损耗计算,逆变电感参数设计损耗计算 mathcad格式输出,方便修改 同时支持plecs损耗仿真,基于plecs的闭环仿真,电压外环,电流内环
- 毒舌(解锁版).apk
- 显示HEX、S19、Bin、VBF等其他汽车制造商特定的文件格式