Building H2O
多线程的题, 给两个方法, 一边是h一边是o, 问如何即时返回水(h2o). 通过观察可以看到, 水是两个h一个o, 那么当一个o出现的时候, 我们就检查是否有两个h. 当h不够2的时候, 就等h够2再继续运行. 所以一个互斥锁即可.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class H2O { private AtomicInteger water; public H2O() { water = new AtomicInteger(); } public void hydrogen(Runnable releaseHydrogen) throws InterruptedException { synchronized(water){ while(water.get() == 2) water.wait(); water.addAndGet(1); releaseHydrogen.run(); water.notifyAll(); } // releaseHydrogen.run() outputs "H". Do not change or remove this line. } public void oxygen(Runnable releaseOxygen) throws InterruptedException { synchronized(water){ while(water.get() < 0) water.wait(); water.addAndGet(-2); releaseOxygen.run(); water.notifyAll(); } } } |