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