Java ではなく Python の話です。
Thread生成時の引数にどういう転送用のオブジェクトを渡すか。。。
以下、サンプルです。
Queue を使う
ThA.py
# -*- coding: utf-8 -*- from threading import Thread import time import sys sys.path.append("../logtool") from logtool.logger import Logger class ThreadA(Thread): def __init__(self, queue): super().__init__() self.logger = Logger() self._queue = queue self._name = 'ThreadA' def run(self): self.logger.debug('sleep 2') time.sleep(2) self._queue.put('A') self.logger.debug('queue put ')
ThB.py
# -*- coding: utf-8 -*- from threading import Thread import sys sys.path.append("../logtool") from logtool.logger import Logger class ThreadB(Thread): def __init__(self, queue): super().__init__() self.logger = Logger() self._queue = queue self._name = 'ThreadB' def run(self): self.logger.debug('start') val = self._queue.get() self.logger.debug('queue get = %s' % val)
ThreadA でセットしたQueue を ThreadB で取得
# -*- coding: utf-8 -*- import sys sys.path.append("../logtool") from logtool.logger import Logger from queue import Queue from ThA import ThreadA from ThB import ThreadB if __name__ == '__main__': logger = Logger() logger.debug('-- Main START --') queue = Queue() tb = ThreadB(queue) ta = ThreadA(queue) tb.start() ta.start() tb.join() ta.join() logger.debug('-- Main END --')
ThreadB は、Queue の get() で、値が入るまで待ち合わせができます。
List(配列) を使う
# -*- coding: utf-8 -*- from threading import Thread, Condition import time import sys sys.path.append("../logtool") from logtool.logger import Logger class ThreadA(Thread): def __init__(self, cv, list): super().__init__() self.logger = Logger() self._cv = cv self._list = list self._name = 'ThreadA' def run(self): global cv self._list.append('A') self.logger.debug('list append') with self._cv: self._cv.notify() class ThreadB(Thread): def __init__(self, cv, list): super().__init__() self.logger = Logger() self._cv = cv self._list = list self._name = 'ThreadB' def run(self): with self._cv: self.logger.debug('wait') self._cv.wait() v = self._list.pop() self.logger.debug('list pop %s' % v)
待ち合わせ、同期の為に、threading.Condition を使います。
from threading import Condition import sys sys.path.append("../logtool") if __name__ == '__main__': list = [] cv = Condition() tb = ThreadB(cv, list) ta = ThreadA(cv, list) tb.start() ta.start() tb.join() ta.join()
通知先が複数の場合を考慮すると threading.Condition を併用すべきですが、
シンプルな queue.Queue は、空の場合、get() でブロックしてくれるので魅力です。