前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高并发面试之多线程实例

高并发面试之多线程实例

作者头像
我的小熊不见了丶
发布2019-05-22 23:58:52
6390
发布2019-05-22 23:58:52
举报
文章被收录于专栏:晓月寒·晓月寒·

实现一个容器,提供两个方法,add,size。写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束。

  1. 用普通线程方法来实现
  2. 用volitile关键字实现
  3. 用wait和notify实现
  4. 使用latch替代wait notify实现

普通线程

代码语言:javascript
复制
public class Exercise318<T> {
    private List<T> elements = new ArrayList<>();

    private long size = 0;

    public void add(T t) {
            elements.add(t);
            size++;
    }

    public long size() {
        return size;
    }

    public static void main(String[] args) {
        Exercise318 e = new Exercise318();
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                e.add(1);
                System.out.println(e.size());
            }
        });
        Thread thread2 = new Thread(() -> {
            while (true) {
                if (e.size() >= 5) {
                    System.out.println("线程2结束");
                    break;
                }
            }
        });
        thread2.start();
        thread1.start();
    }
}

wait notify

代码语言:javascript
复制
private List<T> elements = new ArrayList<>();

    private long size = 0;

    private static Object lock = new Object();

    public void add(T t) {
        elements.add(t);
        size++;
    }

    public long size() {
        return size;
    }

    public static void main(String[] args) {
        Exercise318 e = new Exercise318();
        Thread thread1 = new Thread(() -> {
            synchronized (lock) {
                for (int i = 0; i < 10; i++) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                    if (e.size() == 5) {
                        lock.notify();
                        try {
                            lock.wait();
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }
                    }

                    e.add(1);
                    System.out.println(e.size());
                }
            }

        });
        Thread thread2 = new Thread(() -> {
            synchronized (lock) {
                if (e.size() != 5) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                    System.out.println("线程2结束");
                }
                lock.notify();

            }

        });
        thread2.start();
        thread1.start();
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.03.18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 普通线程
  • wait notify
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档