4.线程的通信
2025年09月21日
4.线程的通信
线程之间除了出现以上对共享资源的争夺关系外,还会出现互为条件的合作关系。例如,在经典的“生产者-消费者”模型中,只有生产者生产出产品,消费者才可以消费(不然没有产品用来消费);只有消费者消费掉产品,生产者才可以生产(不然产品就积压了)。生产者和消费者是互为条件的。这样,消费者在没有产品的时候就等待,当生产者生产出产品时,就要唤醒正在等待的消费者进行消费;反之,生产者在产品没有消费掉的时候就等待,当消费者消费掉产品时,就要唤醒正在等待的生产者进行生产。
生产者和消费者是两道独立并发的线程,但是,二者是一个活动的两个方面,有着制约关系,需要互相通信。
【代码12.14】“生产者-消费者”模型的模拟例程
这里要注意,Producer线程和Consumer线程虽然是两道独立的线程,但是他们的活动是相关的,是对相同产品的生产和消费的两个方面,所以,在创建Producer线程和Consumer线程的时候,为构造方法传入的是同一个Bussiness对象。
对于“生产者”线程,当flag为true(当前有产品时),就调用wait()进入阻塞队列等待,否则,就进行生产,生产结束之后,将flag设为true,调用notify()唤醒阻塞队列中的线程;对于“消费者”线程,当flag为false(当前无产品)时,就调用wait()进入阻塞队列等待,否则,就进行消费,消费结束之后,将flag设为false,调用notify()唤醒阻塞队列中的线程。