实现精准唤醒:A执行后,B执行,B执行后C执行,C执行后A执行——》针对多线程下生产流水线问题,例如:C需要执行必须完成B操作,B操作需要执行必须要完成A操作
代码示例如下所示:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class test
{
public static void main(String[] args) {
Data data = new Data();
new Thread(()->{
for (int i=1;i<=10;i++)
{
data.printA();
}
},"线程A").start();
new Thread(()->{
for (int i=1;i<=10;i++)
{
data.printB();
}
},"线程B").start();
new Thread(()->{
for (int i=1;i<=10;i++)
{
data.printC();
}
},"线程C").start();
}
}
class Data
{
private String executor = "A"; //标识,当前可执行的操作
private Lock lock = new ReentrantLock(); //锁,为了使得多个操作同步进行,这三个操作公用一把锁
private Condition conditionA = lock.newCondition(); //A操作的等待唤醒
private Condition conditionB = lock.newCondition(); //B操作的等待唤醒
private Condition conditionC = lock.newCondition(); //C操作的等待唤醒
public void printA()
{
lock.lock();//上锁
try
{
while (executor!="A")//使用while判断不使用if判断,防止虚假唤醒
{
conditionA.await();
}
executor="B";//指定下一个操作者
conditionB.signal();//将其唤醒
System.out.println(Thread.currentThread().getName()+"执行了,唤醒B");
}catch (Exception e)
{
e.printStackTrace();
}
finally
{
lock.unlock();//shi释放占有的锁
}
}
public void printB()
{
lock.lock();
try
{
while (executor!="B")
{
conditionB.await();
}
executor="C";
conditionC.signal();
System.out.println(Thread.currentThread().getName()+"执行了,唤醒C");
}catch (Exception e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
}
}
public void printC()
{
lock.lock();
try
{
while (executor!="C")
{
conditionC.await();
}
executor="A";
conditionA.signal();
System.out.println(Thread.currentThread().getName()+"执行了,唤醒A");
}catch (Exception e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
}
}
}