生产者消费者模式
发布日期:2021-10-18 18:51:26 浏览次数:2 分类:技术文章

本文共 6015 字,大约阅读时间需要 20 分钟。

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/**
使用重入锁未来保证消费和分发任务同步 * Created by yy on 17/2/8. */public class JavaThreadPool {    public static void main(String[] args) throws InterruptedException {        JavaThreadPool javaThreadPool = new JavaThreadPool();        javaThreadPool.production();        javaThreadPool.consumption();    }    //设置阻塞队列容量    LinkedBlockingDeque linkedBlockingDeque = new LinkedBlockingDeque(100);    //设置线程数量    ExecutorService pool = Executors.newFixedThreadPool(2);    /**     * 生产者     *     * @param     */    public void production() {        Thread thread = new Thread(new Runnable() {            @Override            public void run() {                int i = 0;                while (true) {                    i++;                    try {                        linkedBlockingDeque.put(i);                        System.out.println("生产了:" + i);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        });        thread.start();    }    final Lock lock = new ReentrantLock();    final Condition condition_1 = lock.newCondition();    final Condition condition_2 = lock.newCondition();    /**     * 消费者     */    public void consumption() throws InterruptedException {        Thread thread = new Thread(new Runnable() {            @Override            public void run() {                ThreadGroup group = new ThreadGroup("测试线程组") {                    public void uncaughtException(Thread t, Throwable e) {                        System.out.println(t.getName() + ": " + e.getMessage());                    }                };                while (true) {                    lock.lock();                    try {                        Object obj = linkedBlockingDeque.take();                        pool.execute(new Examples(group, obj, lock, condition_1, condition_2));                        condition_2.signal();                        condition_1.await();                    } catch (InterruptedException e) {                        e.printStackTrace();                    } finally {                        lock.unlock();                    }                }            }        });        thread.start();        Thread.sleep(2000);        new Thread(new Runnable() {            @Override            public void run() {                lock.lock();                try {                    condition_1.signal();                } finally {                    lock.unlock();                }            }        }).start();    }}/** * 执行线程 */class Examples extends Thread {    ThreadGroup group;    Object obj;    Lock lock;    Condition condition_1;    Condition condition_2;    Examples(ThreadGroup group, Object obj, Lock lock, Condition condition_1, Condition condition_2) {        this.group = group;        this.obj = obj;        this.lock = lock;        this.condition_1 = condition_1;        this.condition_2 = condition_2;    }    @Override    public void run() {        lock.lock();        try {            condition_2.await();            Thread.sleep(1000 * 1);            System.out.println(group.getName()+": 消费了:" + obj);            condition_1.signal();        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }}

上面代码存在单线程执行问题:影响执行效率。

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingDeque;/** * Created by yuanyong on 17/2/8. */public class JavaThreadPool {    public static void main(String[] args) throws InterruptedException {        JavaThreadPool javaThreadPool = new JavaThreadPool();        javaThreadPool.production();        javaThreadPool.consumption();    }    //设置阻塞队列容量    LinkedBlockingDeque linkedBlockingDeque = new LinkedBlockingDeque(100);    //设置线程数量    ExecutorService pool = Executors.newFixedThreadPool(4);    /**     * 生产者     *     * @param     */    public void production() {        Thread thread = new Thread(new Runnable() {            @Override            public void run() {                int i = 0;                while (true) {                    i++;                    try {                        linkedBlockingDeque.put(i);//                        System.out.println("生产了:" + i);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        });        thread.start();    }        /**     * 消费者     */    public void consumption() throws InterruptedException {        new Thread(new Runnable() {            @Override            public void run() {                ThreadGroup group = new ThreadGroup("测试线程组") {                    public void uncaughtException(Thread t, Throwable e) {                        System.out.println(t.getName() + ": " + e.getMessage());                    }                };                while (true) {                        pool.execute(new Examples(group, linkedBlockingDeque));                }            }        }).start();    }}/** * 执行线程 */class Examples extends Thread {    ThreadGroup group;    LinkedBlockingDeque linkedBlockingDeque;    Examples(ThreadGroup group,LinkedBlockingDeque linkedBlockingDeque) {        this.group = group;        this.linkedBlockingDeque = linkedBlockingDeque;    }    @Override    public void run() {        try {            Integer obj = (Integer) linkedBlockingDeque.take();            System.out.println("linkedBlockingDeque.size="+linkedBlockingDeque.size());            Thread.sleep(1000 * 1);            System.out.println(group.getName()+":"+Thread.currentThread().getName()+": 消费了:" + obj);        } catch (InterruptedException e) {            e.printStackTrace();        }     }}

转载地址:https://blog.csdn.net/u011153869/article/details/54964571 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:RecursiveTask
下一篇:ReentrantLock

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月12日 06时10分26秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

微信公众号介绍_以及注册订阅号---微信公众号开发工作笔记0001 2019-04-26
Vue模板语法---vue工作笔记0003 2019-04-26
Vue计算属性之基本使用---vue工作笔记0004 2019-04-26
Vue监视---vue工作笔记0005 2019-04-26
Vue条件渲染---vue工作笔记0008 2019-04-26
Vue事件处理_vue的事件处理超级方便_功能强大---vue工作笔记0011 2019-04-26
Vue表单数据自动收集---vue工作笔记0012 2019-04-26
Vue生命周期---vue工作笔记0013 2019-04-26
ES6-ES11新特性_ECMAScript_简单介绍---JavaScript_ECMAScript工作笔记001 2019-04-26
ES6-ES11新特性_ECMAScript相关名词介绍_---JavaScript_ECMAScript工作笔记002 2019-04-26
ES6新特性_let变量声明以及声明特性---JavaScript_ECMAScript_ES6-ES11新特性工作笔记003 2019-04-26
Sharding-Sphere,Sharding-JDBC_介绍_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记001 2019-04-26
Sharding-Sphere,Sharding-JDBC_分库分表介绍_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记002 2019-04-26
C++_类和对象_对象特性_构造函数的分类以及调用---C++语言工作笔记041 2019-04-26
C++_类和对象_对象特性_拷贝构造函数调用时机---C++语言工作笔记042 2019-04-26
C++_类和对象_对象特性_构造函数调用规则---C++语言工作笔记043 2019-04-26
C++_类和对象_对象特性_深拷贝与浅拷贝---C++语言工作笔记044 2019-04-26
AndroidStudio_java.util.ConcurrentModificationException---Android原生开发工作笔记237 2019-04-26
AndroidStudio_android中实现对properties文件的读写操作_不把properties文件放在assets文件夹中_支持读写---Android原生开发工作笔记238 2019-04-26
弹框没反应使用Looper解决_the caller should invoke Looper.prepare() and Looper.loop()---Android原生开发工作笔记239 2019-04-26