下面程序代码通过使用Lock锁执行简单的流水线任务:
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @author lzq * @data 2020/4/29 0029 - 下午 9:48 */ public class TestLock { public static void mAIn(String[] args) { DataSource dataSource=new DataSource(); new Thread(() -> { for (int i=0;i<10;i++){ dataSource.a(); } },"A").start(); new Thread(() -> { for (int i=0;i<10;i++){ dataSource.b(); } },"B").start(); new Thread(() -> { for (int i=0;i<10;i++){ dataSource.c(); } },"C").start(); } } class DataSource{ private int x=1; private Lock lock=new ReentrantLock(); private Condition condition1=lock.newCondition(); private Condition condition2=lock.newCondition(); private Condition condition3=lock.newCondition(); public void a(){ lock.lock(); try { while(x!=1){ condition1.await(); } System.out.println(Thread.currentThread().getName()+":aaa"); x=2; condition2.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void b(){ lock.lock(); try { while(x!=2){ condition2.await(); } System.out.println(Thread.currentThread().getName()+":bbb"); x=3; condition3.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void c(){ lock.lock(); try { while(x!=3){ condition3.await(); } System.out.println(Thread.currentThread().getName()+":ccc"); x=1; condition1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }
执行结果如下: