线程交替打印

两个不同的线程将会共用一个 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();
    }
}

你可能感兴趣的