练手——蚂蚁二面笔试题

这篇博客主要记录了蚂蚁金服笔试中遇到的三道题目,包括如何用多线程交替打印奇数和偶数、实现超时队列以及KMP字符串匹配算法的理解。作者探讨了线程池和线程同步的重要性,并提供了代码实现,还分析了线程池优于单独线程的原因。
摘要由CSDN通过智能技术生成

练手——蚂蚁二面笔试题

1. 起两个线程,交替打印奇数和偶数

一拿到这个题目有几个思路,1.共享变量,2.等待/通知机制,其实感觉考察的是进程通信的方式(6种)

共享变量实现如下:

public class oddAndEvenPrintThread {
   
    public static int cnt = 0;
    public static final int RANGE = 1000;
    public static List<Integer> ans = new ArrayList<>(RANGE);

    public static void main(String[] argus) {
   
        Thread oddPrinter = new Thread(() -> {
   
            while (cnt < RANGE) {
   
                if ((cnt & 1) == 1) {
   
                    //System.out.println(cnt);
                    ans.add(cnt);
                    cnt++;
                }
            }
        }, "oddPrinter");

        Thread evenPrinter = new Thread(() -> {
   
            while (cnt < RANGE) {
   
                if ((cnt & 1) == 0) {
   
                    //System.out.println(cnt);
                    ans.add(cnt);
                    cnt++;
                }
            }
        }, "evenPrinter");

        try {
   
            oddPrinter.start();
            evenPrinter.start();
            oddPrinter.join();
            evenPrinter.join();
        } catch (Exception e) {
   
            e.printStackTrace();
        }
        ans.forEach((a) -> System.out.print(a + " "));
    }
}

其实这里可以有几个优化的地方,1.用线程池代替单独的线程;2.当不满足cnt条件时可以加一个yield主动放弃cpu资源(这个见仁见智,我觉得没必要,多核cpu还会增加上下文切换的开销)

用线程池又写了一个版本:(此处如果面试还能再阐述下线程池的几个好处,绝对的加分项)

public class oddAndEvenPrintThread {
   
    public static int cnt = 0;
    public static final int RANGE = 1000;
    public static List<Integer> ans = new ArrayList<>(RANGE);
    public static final ExecutorService oddExecutorService = new ThreadPoolExecutor(1,1,60L, TimeUnit.SECONDS,new LinkedBlockingQueue<>());
    public static final Executor
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值