不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • 数据结构

  • 算法基础

  • 算法题分类

    • 01.数组
    • 04.数组_双指针_排序_子数组
    • 06.回溯算法
    • 08.动态规划
    • 11.字符串
    • 21.链表
    • 31.树
    • 41.数学
    • 61.矩阵
    • 100.其他
    • 200.整理
    • 210.多线程
      • 01.按序打印
        • 1.1 题目描述
        • 1.2 解题思路
        • 1.3 用户锁:线程锁
      • 02.红绿灯路口
        • 2.1 题目描述
  • 算法
  • 算法题分类
xiaonaiqiang
2021-06-19
目录

210.多线程

# 01.按序打印

# 1.1 题目描述

  • 按序打印 (opens new window)

  • 三个不同的线程 A、B、C 将会共用一个 Foo 实例。

    • 一个将会调用 first() 方法
    • 一个将会调用 second() 方法
    • 还有一个将会调用 third() 方法
  • 请设计修改程序,以确保 second() 方法在 first() 方法之后被执行

  • third() 方法在 second() 方法之后被执行。

class Foo(object):
    def __init__(self):
        pass

    def first(self, printFirst: 'Callable[[], None]') -> None:
        printFirst()

    def second(self, printSecond: 'Callable[[], None]') -> None:
        printSecond()

    def third(self, printThird: 'Callable[[], None]') -> None:
        printThird()
1
2
3
4
5
6
7
8
9
10
11
12

# 1.2 解题思路

from threading import Lock

class Foo:
    def __init__(self):
        self.firstJobDone = Lock()           # 生成全局锁  threading.Lock()
        self.secondJobDone = Lock()          # 生成全局锁  threading.Lock()
        self.firstJobDone.acquire()          # 修改数据前加锁 lock.acquire()
        self.secondJobDone.acquire()         # 修改数据前加锁 lock.acquire()

    def first(self, printFirst) -> None:
        printFirst()
        self.firstJobDone.release()   # 修改后释放锁,通知正在等待完成第一个作业的线程

    def second(self, printSecond) -> None:
        with self.firstJobDone:      # 等待第一项工作完成
            printSecond()
            self.secondJobDone.release()  # 通知正在等待完成第二个作业的线程

    def third(self, printThird) -> None:
        with self.secondJobDone:     # 等待第二项工作完成
            printThird()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 1.3 用户锁:线程锁

import time
import threading
lock = threading.Lock()           #1 生成全局锁
def addNum():
    global num                #2 在每个线程中都获取这个全局变量
    print('--get num:',num )
    time.sleep(1)
    lock.acquire()              #3 修改数据前加锁
    num  -= 1                 #4 对此公共变量进行-1操作
    lock.release()             #5 修改后释放
1
2
3
4
5
6
7
8
9
10

# 02.红绿灯路口

# 2.1 题目描述

  • 红绿灯路口 (opens new window)

  • 这是两条路的交叉路口。

  • 第一条路是 A 路,车辆可沿 1 号方向由北向南行驶,也可沿 2 号方向由南向北行驶。

  • 第二条路是 B 路,车辆可沿 3 号方向由西向东行驶,也可沿 4 号方向由东向西行驶。

  • 每条路在路口前都有一个红绿灯,红绿灯可以亮起红灯或绿灯。

上次更新: 2025/3/17 15:44:49
200.整理

← 200.整理

最近更新
01
05.快递Agent智能体
06-04
02
200.AI Agent核心概念
06-04
03
105.Agent智能体梳理
06-04
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式