FooBarを交互に印刷-2つのイベントを使用して達成する(イベント)

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スレッドは、Event3つの主要なメソッドを持つイベントオブジェクトを試しました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から来ています

おすすめ

転載: blog.csdn.net/qq_39378657/article/details/109574510