关于java:线程交替打印

56次阅读

共计 1045 个字符,预计需要花费 3 分钟才能阅读完成。

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

正文完
 0