专栏首页晓月寒·高并发面试之多线程实例

高并发面试之多线程实例

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

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

普通线程

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

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();
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Boot从入门到精通-注解详解

    -Documented:Documented注解表明这个注释是由 javadoc记录的。 以上是三个公共注解,基本上所有的注解都会继承这三个注解。

    我的小熊不见了丶
  • linux的命令操作

    查看有谁在线(哪些人登陆到了服务器) who 查看当前在线 last 查看最近的登陆历史记录

    我的小熊不见了丶
  • java中的各种锁性能比较及原理

    一个进程中可以同时运行多个线程,彼此之间使用相同的地址空间,共享大部分数据。启动一个线程所花费的空间远小于启动一个进程所花费的空间。

    我的小熊不见了丶
  • 2018-9-17-windows和office激活异同

    对于我们这种修电脑、卖电脑的行业(软件工程师(大雾))。可能会遇到出货产品需要进行windows软件激活的订单。(真的就是属于卖电脑的范畴)

    黄腾霄
  • 【Java多线程-6】synchronized同步锁

    前文描述了Java多线程编程,多线程的方式提高了系统资源利用和程序效率,但多个线程同时处理共享的数据时,就将面临线程安全的问题。

    云深i不知处
  • 聊天机器人实战教程 | PyTorch专栏

    在本教程中,我们探索一个好玩有趣的循环的序列到序列(sequence-to-sequence)的模型用例。我们将用Cornell Movie-Dialogs C...

    磐创AI
  • 使用 Pandas 处理亿级数据

    在数据分析领域,最热门的莫过于Python和R语言,此前有一篇文章《别老扯什么Hadoop了,你的数据根本不够大》指出:只有在超过5TB数据量的规模下,Hado...

    IT派
  • gRPC 使用 protobuf 构建微服务

    以前使用 Laravel 做 web 项目时,是根据 MVC 去划分目录结构的,即 Controller 层处理业务逻辑,Model 层处理数据库的 CURD,...

    aoho求索
  • 创建线程以及线程池时候要指定与业务相关的名字,以便于追溯问题

    日常开发中当一个应用中需要创建多个线程或者线程池时候最好给每个线程或者线程池根据业务类型设置具体的名字,以便在出现问题时候方便进行定位,下面就通过实例来说明不设...

    加多
  • 华为在俄罗斯第三家科研中心终于确定,将与鞑靼斯坦共和国共同推进信息通信技术发展

    华为于海外布局又进一步,将在俄罗斯鞑靼斯坦共和国设立科研中心,用以研发信息通信技术。在双方签署的一系列合作文件中,包括一系列目标与任务,如现代化技术研发、吸引科...

    镁客网

扫码关注云+社区

领取腾讯云代金券