package com.learn; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Thread_Execute_Order { public static void main(String[] args) { Resource resource = new Resource(); new Thread(() -> { try { //很重要,让其它依赖线程先执行wait方法。可以自己去掉试一下 Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } for(int i=0;i <5 ;i++){ resource.method1(); } },"ThreadA").start(); new Thread(() -> { for(int i=0;i <5 ;i++){ resource.method2(); } },"ThreadB").start(); new Thread(() -> { for(int i=0;i <5 ;i++){ resource.method3(); }},"ThreadC").start(); } } class Resource{ private Lock lock = new ReentrantLock(); private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private Condition condition3 = lock.newCondition(); private boolean methodBeginFlag = false; public void method1(){ lock.lock(); try { if(!methodBeginFlag ){ //无条件限制性method1 methodBeginFlag = true ; }else{ condition1.await(); } System.out.println("------------------->执行method1"); Thread.sleep(1*1000); condition2.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void method2(){ lock.lock(); try { condition2.await(); System.out.println("------------------->执行method2"); Thread.sleep(1*1000); condition3.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void method3(){ lock.lock(); try { condition3.await(); System.out.println("------------------->执行method3"); Thread.sleep(1*1000); condition1.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } }
使用Lock实现线程的顺序执行(精准唤醒)
最新推荐文章于 2022-07-10 15:41:48 发布
本文介绍了一个使用Java ReentrantLock和Condition实现的线程执行顺序控制示例,展示了如何确保ThreadA等待其他线程执行完特定任务后再继续。通过Resource类的三个方法(method1, method2, method3)展示锁和条件变量在协调线程执行中的应用。
摘要由CSDN通过智能技术生成