题目1114.按序打印
我们提供了一个类:
1 | public class Foo { |
三个不同的线程将会共用一个 Foo 实例。
1. 线程 A 将会调用 one() 方法
2. 线程 B 将会调用 two() 方法
3. 线程 C 将会调用 three() 方法
请设计修改程序,以确保 two() 方法在 one() 方法之后被执行,three() 方法在 two() 方法之后被执行。
代码
1 | class Foo { |
1 | class Foo3 { |
1 | class Foo5 { |
1 | class Foo6 { |
题目1115. 交替打印FooBar
两个不同的线程将会共用一个 FooBar 实例。其中一个线程将会调用 foo() 方法,另一个线程将会调用 bar() 方法。
请设计修改程序,以确保 “foobar” 被输出 n 次。
代码
1 | class FooBar { |
题目1116. 打印零与奇偶数
假设有这么一个类:
1 | class ZeroEvenOdd { |
相同的一个 ZeroEvenOdd 类实例将会传递给三个不同的线程:
线程 A 将调用 zero(),它只输出 0 。
线程 B 将调用 even(),它只输出偶数。
线程 C 将调用 odd(),它只输出奇数。
每个线程都有一个 printNumber 方法来输出一个整数。请修改给出的代码以输出整数序列 010203040506… ,其中序列的长度必须为 2n。
用例
输入:n = 2
输出:”0102”
输入:n = 5
输出:”0102030405”
解题思路
- ReentrantLock
- Semaphore
代码
1 | class ZeroEvenOdd2 { |
题目1117. H2O 生成
现在有两种线程,氧 oxygen 和氢 hydrogen,你的目标是组织这两种线程来产生水分子。
存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。
氢和氧线程会被分别给予 releaseHydrogen 和 releaseOxygen 方法来允许它们突破屏障。
这些线程应该三三成组突破屏障并能立即组合产生一个水分子。
你必须保证产生一个水分子所需线程的结合必须发生在下一个水分子产生之前。
换句话说:
如果一个氧线程到达屏障时没有氢线程到达,它必须等候直到两个氢线程到达。
如果一个氢线程到达屏障时没有其它线程到达,它必须等候直到一个氧线程和另一个氢线程到达。
书写满足这些限制条件的氢、氧线程同步代码。
用例
输入: “HOH”
输出: “HHO”
输入: “OOHHHH”
输出: “HHOHHO”
解题思路
利用Semaphore和CycleBarrier来实现控制,最开始想用CountdownLatch来实现,但是CountDownLatch是一个不可复用的类型
代码
1 | class H2O { |
题目
解题思路
思路一:哲学家用餐的时候要么同时拿起两只叉子,要么都不要拿
思路二:要求哲学家拿筷子的顺序要相同,先拿序号小的
代码
1 | public class Philosopher extends Thread { |
1 | import java.util.concurrent.Semaphore; |
题目
用例
解题思路
代码
发布时间: 2020-07-14
最后更新: 2020-08-13
本文标题: leetcode-day27
本文链接: http://huangketsudou.github.io/2020/07/14/leetcode-day27/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处