FooBarを交互に印刷する
私たちはクラスを提供します:
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");
}
}
}
2つの異なるスレッドがFooBarインスタンスを共有します。一方のスレッドはfoo()メソッドを呼び出し、もう一方のスレッドはbar()メソッドを呼び出します。
「foobar」がn回出力されるようにプログラムを設計および変更してください。
例1:
入力:n = 1
出力: "foobar"
説明:非同期で開始された2つのスレッドがあります。1つはfoo()メソッドを呼び出し、もう1つはbar()メソッドを呼び出します。「foobar」は1回出力されます。
例2:
入力:n = 2
出力: "foobarfoobar"
説明: "foobar"は2回出力されます。
分析
Pythonスレッドは、Event
3つの主要なメソッドを持つイベントオブジェクトを試しました。set() clear() wait()
プロセスまたはスレッドの同期の概念にも同様の説明があります。1つのプロセス(またはスレッド)の実行は、別のプロセス(またはスレッド)の実行状態に依存します。
2つのEvent
オブジェクトを使用すると、1つのスレッドイベントのトリガーは、別のスレッドイベントのトリガーに依存します。
解決
from threading import Event
class FooBar:
def __init__(self, n):
self.n = n
self.event_bar = Event()
self.event_foo = Event()
self.event_foo.set()
def foo(self, printFoo: 'Callable[[], None]') -> None:
for i in range(self.n):
self.event_foo.wait()
# printFoo() outputs "foo". Do not change or remove this line.
printFoo()
# 阻塞foo
self.event_foo.clear()
# 唤醒bar
self.event_bar.set()
def bar(self, printBar: 'Callable[[], None]') -> None:
for i in range(self.n):
self.event_bar.wait()
# printBar() outputs "bar". Do not change or remove this line.
printBar()
# 阻塞bar
self.event_bar.clear()
# 唤醒foo
self.event_foo.set()
トピックはleetcodeから来ています