leetcode刷题多线程之打印零与奇数偶数

使用Semaphore()

import threading

class ZeroEvenOdd:
    def __init__(self, n):
        self.n = n
        self.l1 = threading.Semaphore(1)
        self.l2 = threading.Semaphore(0)
        self.l3 = threading.Semaphore(0)

        
	# printNumber(x) outputs "x", where x is an integer.
    def zero(self, printNumber: 'Callable[[int], None]') -> None:
        for i in range(self.n):
            self.l1.acquire()
            printNumber(0)
            if i % 2 == 0:
                self.l3.release()
            else:
                self.l2.release()
            
        
    def even(self, printNumber: 'Callable[[int], None]') -> None:
        for i in range(2, self.n+1, 2):#迭代过程需要注意
            self.l2.acquire()
            printNumber(i)
            self.l1.release()
            
    def odd(self, printNumber: 'Callable[[int], None]') -> None:
        for i in range(1, self.n+1, 2):
            self.l3.acquire()
            printNumber(i)
            self.l1.release()

使用Lock()

import threading

class ZeroEvenOdd:
    def __init__(self, n):
        self.n = n
        self.l1 = threading.Lock()
        self.l2 = threading.Lock()
        self.l3 = threading.Lock()
        self.l2.acquire()
        self.l3.acquire()

        
	# printNumber(x) outputs "x", where x is an integer.
    def zero(self, printNumber: 'Callable[[int], None]') -> None:
        for i in range(self.n):
            self.l1.acquire()
            printNumber(0)
            if i % 2 == 0:
                self.l3.release()
            else:
                self.l2.release()
            
        
    def even(self, printNumber: 'Callable[[int], None]') -> None:
        for i in range(2, self.n+1, 2):
            self.l2.acquire()
            printNumber(i)
            self.l1.release()
            
    def odd(self, printNumber: 'Callable[[int], None]') -> None:
        for i in range(1, self.n+1, 2):
            self.l3.acquire()
            printNumber(i)
            self.l1.release()

你可能感兴趣的:(leetcode_python)