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币余额
- 我的收藏
- 我的下载
- 下载帮助