多线程通信
多线程通信即多线程交互问题,举个例子:线程一网上下载音乐,线程二播放下载的音乐。
交互问题都可以归类为生产者和消费者问题:
生产者生产时消费者休眠,生产好后生产者唤醒消费者然后生产者休眠,消费者消费完之后再唤醒生产者然后消费者休眠,生产者还是工作。
在这里生产者和消费者各代表一个线程。
在Object类中有几个方法是用于多线程通信问题:
举例子
下面我们举一个关于生产者与消费者的例子:
厨师为生产者,服务员为消费者;
这里输出的结果是会出现问题,如图输出结果的一部分:
可以看到饭变成了有味,菜变成了无味。
原因是:setNameAndsetTaste中name和taste的设置中间隔了100毫秒,也就是在name设置好之后,服务员就过来把name和上次设置的,这次还未来得及从新设置的taste通过调用get()取走。
如何做:
使用线程安全解决?
此方法是行不通的,Cook和Waiter虽然操作的同一个堆内存,通过锁一个线程进去另外一个进不来,但是线程安全是非公平锁,有可能Cook出来后又立马抢到了锁又进去了一次,这回导致前面一次Cook产生的数据Waiter无法及时拿到。
只能使用消费者和生产者分别休眠进行解决。实现过程如下所示:
中间使用notifyAll和wait方法实现对线程的启动和休眠