美文网首页
多线程:两个线程交互运行

多线程:两个线程交互运行

作者: 陈忠俊 | 来源:发表于2020-08-08 20:39 被阅读0次

这里主要是建立了两个线程锁,运行自己线程调用函数时获得自己的锁,并释放另外一个线程调用函数的锁。

以下运行,获得lock_num锁的时候,释放lock_char锁,反之一样。

from threading import Thread, Lock, main_thread
import time
lock_num = Lock() 
lock_char = Lock()

# 线程类
class MyThread(Thread):
    def __init__(self, thread_id, func, args):
        super().__init__()
        self.thread_id = thread_id
        self.func = func
        self.args = args
        self.count = len(args)
    def run(self):   
        while self.count:
            self.func(self.args)
            self.count -= 1

# 函数一,打印出数字
def print_num(nums):
    lock_num.acquire()
    if len(nums) > 0:
        print(nums.pop(0))
    lock_char.release()
    time.sleep(1)

# 线程2,打印出字符
def print_char(chars):
    lock_char.acquire()
    if len(chars) > 0:
        print(chars.pop(0))
    lock_num.release()
    time.sleep(1)

nums = [1,2,3,4]
chars = ['a', 'b', 'c', 'd']

lock_num.acquire()
t1 = MyThread('thread-1', print_num, nums) # 线程一
t2 = MyThread('thread-2', print_char, chars) # 线程二

t1.start() # 启动线程
t2.start()
t1.join() # 等待所有子线程结束
t2.join()

输出形式如下:

a
1
b
2
c
3
d
4

另外一个方式,利用Condition。但是这里有个问题,在主线程退出之后,子线程不能自动退出。还没找到解决方法。

from threading import Lock, Thread, Condition
from queue import Queue
import time

cdt = Condition()

class ThreadNum(Thread):
    def __init__(self, thread_id, args):
        super().__init__()
        self.thread_id = thread_id
        self.args = args
    
    def run(self):
        while True:
            if cdt.acquire():
                if len(self.args) != 0:
                    print(self.args.pop(0))
                    cdt.notify()
                    cdt.wait()
                else:
                    break
                cdt.release()
                time.sleep(0.3)

class ThreadChar(Thread):
    def __init__(self, thread_id, args):
        super().__init__()
        self.thread_id = thread_id
        self.args = args

    def run(self):
        while True:
            if cdt.acquire():
                if len(self.args) != 0:
                    print(self.args.pop(0))
                    cdt.notify()
                    cdt.wait()
                else:
                    break
                cdt.release()
                time.sleep(0.3)

th1 = ThreadNum('th1', [1,2,3,4,5,6,7,8])
th2 = ThreadNum('th2', ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

th1.start()
th2.start()

相关文章

  • 多线程:两个线程交互运行

    这里主要是建立了两个线程锁,运行自己线程调用函数时获得自己的锁,并释放另外一个线程调用函数的锁。 以下运行,获得l...

  • Java基础day11笔记:多线程同步函数|synchroniz

    11-多线程(多线程-同步函数) 银行类: 储户类: 主函数中开两个线程: 运行结果: 但...

  • Java基础之多线程

    什么是多线程?   线程是指程序运行的流程,多线程则是指可以运行一个以上线程的程序,多线程使程序运行的效率变得更高...

  • 线程间通信实例

    如何让两个线程依次执行? 主线程等待子线程运行 那如何让 两个线程按照指定方式有序交叉运行呢? 多线程交替打印AB...

  • 多线程

    多线程指的是一个程序中运行多个任务多线程的目的是为了更好的使用 CPU资源例如两个程序需要并发执行就需要多线程注意...

  • 线程(Thread)

    Java 多线程编程 Java 给多线程编程提供了内置的支持。一个多线程程序包含两个或多个能并发运行的部分。程序的...

  • 学习Java多线程编程前必须要掌握的概念

    Java是一种多线程编程语言,我们可以使用Java来开发多线程程序。 多线程程序包含两个或多个可同时运行的部分,每...

  • 1 Java并发是什么?

    Java是一种多线程编程语言,我们可以使用Java来开发多线程程序。 多线程程序包含两个或多个可同时运行的部分,每...

  • Java多线程

    Java 多线程编程Java 给多线程编程提供了内置的支持。一个多线程程序包含两个或多个能并发运行的部分。程序的每...

  • Java基础知识9-多线程1

    什么是多线程 java对多线程编程提供了内置支持。多线程程序包含同时运行的两个或多个部分。这种程序的每个部分被称为...

网友评论

      本文标题:多线程:两个线程交互运行

      本文链接:https://www.haomeiwen.com/subject/lhxkdktx.html