多线程

/ Java / 0 条评论 / 222浏览
1. join
阻塞当前进程,直到调用join方法的那个进程执行完,再继续执行当前进程
#encoding:utf-8
from multiprocessing import Process
import os, time, random

def r1(process_name):
for i in range(5):
print process_name, os.getpid() #打印出当前进程的id
time.sleep(random.random())
def r2(process_name):
for i in range(5):
print process_name, os.getpid() #打印出当前进程的id
time.sleep(random.random()*2)

if __name__ == "__main__":
print "main process run..."
p1 = Process(target=r1, args=(‘process_name1‘, ))
p2 = Process(target=r2, args=(‘process_name2‘, ))

p1.start()
p2.start()
p1.join()
#p2.join()
print "main process runned all lines..."

发现主线程只是等待p1完成了,就会向下执行,而不会等待p2是否完成。所以使用多进程的常规方法是,先依次调用start启动进程,再依次调用join要求主进程等待子进程的结束
2.
wait() 必须在synchronized 函数或者代码块里面
wait()会让已经获得synchronized 函数或者代码块控制权的Thread暂时休息,并且丧失控制权
这个时候,由于该线程丧失控制权并且进入等待,其他线程就能取得控制权,并且在适当情况下调用notifyAll()来唤醒wait()的线程。
eg:
http://blog.csdn.net/zljjava/article/details/7940223
可以把ProductStack看作一个产品仓库。当产品仓库满的时候,生产者线程需要wait(),从而放弃对产品仓库的控制。
这个时候消费者线程就可以进来了而取得仓库的控制权。一旦消费者消费了产品,那么仓库就不满了。 这个时候消费者线程就要notifyAll()生产者线程,让等待的生产者线程唤醒。
但是生产者被唤醒后不能马上进行生产,因为它在wait()的时候已经丧失了对仓库的控制权,所以就需要等待消费者线程结束操作,才能重新取得仓库的控制权,再进行生产。