aboutsummaryrefslogtreecommitdiff
path: root/print_foobar_alternately.py
diff options
context:
space:
mode:
authorJack Sangdahl <[email protected]>2025-02-20 00:24:26 -0700
committerJack Sangdahl <[email protected]>2025-02-20 00:24:26 -0700
commit762d832f4aa64cfbbc6db8a6b725f484c022c073 (patch)
tree6f83871e83bfe613777fda4ed7b0c0e9f7785942 /print_foobar_alternately.py
parentf4a2492a0b821a6587e856b3a792b110d6bccf96 (diff)
downloadleetcode-762d832f4aa64cfbbc6db8a6b725f484c022c073.tar.gz
leetcode-762d832f4aa64cfbbc6db8a6b725f484c022c073.zip
1115. print foobar alternately
Diffstat (limited to 'print_foobar_alternately.py')
-rw-r--r--print_foobar_alternately.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/print_foobar_alternately.py b/print_foobar_alternately.py
new file mode 100644
index 0000000..d8b121a
--- /dev/null
+++ b/print_foobar_alternately.py
@@ -0,0 +1,68 @@
+# 1115. Print FooBar Alternately
+from threading import Semaphore
+
+"""
+suppose you are given the following code:
+class FooBar {
+public void foo() {
+ for (int i = 0; i < n; i++) {
+ print("foo");
+ }
+}
+
+public void bar() {
+ for (int i = 0; i < n; i++) {
+ print("bar");
+ }
+}
+}
+the same instance of 'FooBar' will be passed to two different threads: thread
+'a' will call 'foo()' and thread 'b' will call 'bar()'. modify the given
+program to output "foobar" 'n' times.
+"""
+
+
+def printFoo():
+ print("foo")
+
+
+def printBar():
+ print("bar")
+
+
+class FooBar(object):
+ def __init__(self, n):
+ self.n = n
+ self.s_foo = Semaphore(1)
+ self.s_bar = Semaphore(0)
+
+ def foo(self, printFoo):
+ """
+ :type printFoo: method
+ :rtype: void
+ """
+ for i in range(self.n):
+ self.s_foo.acquire()
+ # printFoo() outputs "foo". Do not change or remove this line.
+ printFoo()
+ self.s_bar.release()
+
+ def bar(self, printBar):
+ """
+ :type printBar: method
+ :rtype: void
+ """
+ for i in range(self.n):
+ self.s_bar.acquire()
+ # printBar() outputs "bar". Do not change or remove this line.
+ printBar()
+ self.s_foo.release()
+
+
+if __name__ == "__main__":
+ f1 = FooBar(1)
+ f2 = FooBar(2)
+ f1.foo()
+ f1.bar()
+ f2.foo()
+ f2.bar()