启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5 然后是线程2打印6,7,8,9,10 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20....依次类推, 直到打印到60 三个线程交替打印数字
时间: 2023-07-27 20:24:19 浏览: 54
好的,这是一个典型的多线程编程问题,可以使用锁和条件变量来实现。以下是一个实现该功能的 Python 代码:
```python
import threading
class NumberPrinter:
def __init__(self):
self.print_num = 1
self.lock = threading.Lock()
self.cond_var = threading.Condition(self.lock)
def print_numbers(self, thread_id, start_num):
with self.lock:
while self.print_num <= 60:
if self.print_num % 5 == start_num:
for i in range(5):
print("Thread {}: {}".format(thread_id, self.print_num))
self.print_num += 1
self.cond_var.notify_all()
else:
self.cond_var.wait()
if __name__ == "__main__":
printer = NumberPrinter()
t1 = threading.Thread(target=printer.print_numbers, args=(1, 0))
t2 = threading.Thread(target=printer.print_numbers, args=(2, 1))
t3 = threading.Thread(target=printer.print_numbers, args=(3, 2))
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
```
其中,`NumberPrinter` 类维护了一个 `print_num` 变量表示当前需要打印的数字,一个锁 `lock` 用来保证线程安全,和一个条件变量 `cond_var` 用来协调三个线程的执行。每个线程调用 `print_numbers` 方法,进入循环,如果当前需要由该线程打印数字,就打印 5 个数字,并将 `print_num` 更新为下一个需要打印的数字。否则,该线程就进入等待状态,等待其他线程通知它可以开始执行。三个线程的 `start_num` 参数分别为 0,1,2,表示它们分别从 1,6,11 开始打印数字。最后三个线程使用 `join` 方法等待所有线程执行完毕。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)