携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
这是我们的这个第6天,我们来玩一玩多线程的并发协作模式,最典型的莫过于生产者和消费者模式啦,我想你们肯定知道,今天我们来聊聊这个话题。
背景
就和人一样,多线程也是需要分工合作的,我们按照角色定义它们的分工,生产者就是负责制造数据,消费者呢就是消费数据的,生产者可以是任意的,比如文件转换啊,文件内容导出啊,消费者呢也可以是任意的,但是要和生产者的工作产生联系,你比如邮件发送啊,消费消息等等。
那在实际的工作中呢,我想你应该会遇到数据迁移的场景,我们就来模拟一个数据库迁移来了解生产者和消费者模式,比如你有一个mysql实例,上面有两年的客户数据,然后你的任务就是把旧的数据,迁移到新库中。
你可以开一个线程把数据导出成csv文件,按月导出会有24个文件,你把这些文件放到一个任务队列中,然后呢,你再开一个消费线程,发现队列有csv文件了,他就把这个文件导入到新的mysql中,你可以把这个功能搞成一个jar包。
模型如下:
生产者
这样写行吗?肯定不行啊,这是放在一个main线程做串行化操作,我们要的是生产者和消费者得是单独的线程里,这个要注意一下区别。
串行是这个消费者要等生产者生产完了才能消费,而不是生产一个消费一个,效率低下。
那怎么搞个线程呢?源码里面已经写了一个示例了啊:
消费者
同样改造一下消费者线程