两个不同的线程将会共用一个 FooBar 实例。其中一个线程将会调用 foo() 办法,另一个线程将会调用 bar() 办法。请设计批改程序,以确保 "foobar" 被输入 n 次。起源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/print-foobar-alternately著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。

这是要在线程间进行通信,可应用Lock里的Condition实现,代码如下:

public class OrderThread_Condition{    boolean flag = true;    ReentrantLock lock = new ReentrantLock();    Condition c1 = lock.newCondition();    Condition c2 = lock.newCondition();    public Runnable foo(){        return  new Runnable() {            @Override            public void run() {                lock.lock();                try {                    for(int i=0;i<5;i++){                        if(!flag){                            c1.await();                        }                        flag = false;                        System.out.println("foo");                        c2.signal();                    }                }catch (InterruptedException e){                    e.printStackTrace();                }finally {                    lock.unlock();                }            }        };    }    public Runnable bar(){        return new Runnable() {            @Override            public void run() {                lock.lock();                try {                    for(int i=0;i<5;i++){                        if(flag){                            c2.await();                        }                        flag = true;                        System.out.println("bar");                        c1.signal();                    }                }catch (InterruptedException e){                    e.printStackTrace();                }finally {                    lock.unlock();                }            }        };    }    public static void main(String[] args) {        OrderThread_Condition condition = new OrderThread_Condition();        new Thread(condition.foo()).start();        new Thread(condition.bar()).start();    }}