前言

最近也面了好多家企业,也总结到很多笔试经验和面试经验。笔试大多数Java题目都是牛客网原题和简单排序,数据库,Java基础概念,数据结构,MVC模式等。面试官问的题目涉及的知识无非是Java基础知识,设计模式,网络等。我发现出现频率很高的知识点有多线程,设计模式(单例模式,策略模式,观察者模式)等。今天就来说一下笔试和面试中常见的多线程题目。

笔试

  • 题目:有ABC三个线程,,A线程输出AB线程输出BC线程输出C,要求,同时启动三个线程,,按顺序输出ABC,循环10次。这道题目出现的频率很高啊。
第一种思路
  • 创建3个线程轮流输出,用lock对象去同步线程的状态,用count变量标识出哪个线程,MAX变量用于边界控制,适时退出轮询。

  • 手写代码

public class PrintABC {public static void main(String[] args) {final Lock lock = new ReentrantLock();Thread a = new Thread(new PrintfABCThread("A", lock, 0));Thread b = new Thread(new PrintfABCThread("B", lock, 1));Thread c = new Thread(new PrintfABCThread("C", lock, 2));a.start();b.start();c.start();}
}class PrintfABCThread implements Runnable {private String name;private Lock lock;private Integer flag;public static int count = 0;public static final int MAX = 30;public PrintfABCThread(String name, Lock lock, Integer flag) {this.name = name;this.lock = lock;this.flag = flag;}@Overridepublic void run() {while (true) {lock.lock();if (count >= MAX) {lock.unlock();return;}if (count % 3 == flag) {System.out.println(name);count++;}lock.unlock();}}
}
  • 输出结果
第二种思路
  • 通过Thread类的join()方法让我们开启的线程加入到主线程,只有我们开启的新线程结束后,主线程才能继续执行。

  • 手写代码

public class PrintfABC {public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 10; i++) {Thread a = new Thread(new PrintThread("A"));a.start();a.join();Thread b = new Thread(new PrintThread("B"));b.start();b.join();Thread c = new Thread(new PrintThread("C"));c.start();c.join();}}
}class PrintThread implements Runnable {private String name;public PrintThread(String name) {this.name = name;}@Overridepublic void run() {System.out.println(name);}
}
  • 输出结果

  • 第二个题目: 用多线程去处理"abc""def"“ghi”这个三个字符串,让它们以"adg""beh"“cfi”这种形式输出。这个题目之前是红星美凯龙技术部笔试卷的压轴题,分值是20分。
第一种思路

其实跟第一个题目的解决思路是差不多,唯一变的就是我们要获取下标访问字符串从而获取字符。我们可以通过count变量来标识由哪一个线程输出,通过count / 3 获取下标。

public class DemoTwo {public static void main(String[] args) {final Lock lock = new ReentrantLock();Thread a = new Thread(new PrintThread("abc", lock, 0));Thread b = new Thread(new PrintThread("def", lock, 1));Thread c = new Thread(new PrintThread("ghi", lock, 2));a.start();b.start();c.start();}
}class PrintThread implements Runnable {private String name;private Lock lock;private Integer flag;public static int count = 0;public static int MAX = 9;public PrintThread(String name, Lock lock, Integer flag) {this.name = name;this.lock = lock;this.flag = flag;}@Overridepublic void run() {while (true) {lock.lock();if (count >= MAX) {lock.unlock();return;}if (count % 3 == flag) {System.out.print(name.charAt(count / 3) + " ");count++;}lock.unlock();}}
}
  • 输出结果。
第二种思路
  • 和上面的思路是一样的。

  • 手写代码

public class DemoOne {public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 3; i++) {Thread a = new Thread(new MyThread("abc", i));a.start();a.join();Thread b = new Thread(new MyThread("def", i));b.start();b.join();Thread c = new Thread(new MyThread("ghi", i));c.start();c.join();System.out.println("");}}
}class MyThread implements Runnable {private String str;private int index;public MyThread(String str, int index) {this.str = str;this.index = index;}@Overridepublic void run() {System.out.print(String.valueOf(str.charAt(index)) + " ");}
}
  • 输出结果。

面试

昨天去扫呗面试,面试官问我多线程的实现的二种方式和彼此之间的区别。这个也很简单,百度也烂大街了。

  • 采用extends Thread 方式

    • 优点:编程简单,如果要访问当前线程,无需使用Thread.currentThread()方法,可以直接用this,即可获取当前线程。

    • 缺点:由于继承了Thread,类无法再继承其他的父类。

    • 使用方式:直接new 相应的线程类即可。

  • 采用implements Runnable 方式

    • 优点:没有继承Thread类,所以可以继承其他的父类,在这种形式下,多个线程可以共享同一个对象,所以非常合适多个相同的线程来处理同一份资源的情况下,把cpu代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。适用场景,比如卖票。

    • 缺点:编程稍微复杂,如果要访问当前线程,必须使用Thread.currentThread()方法。

    • 使用方式:不能直接创建所需类的对象并运行它,而是必须从Thread类的一个实例内部启动它。

    public Thread(Runnable target) {init(null, target, "Thread-" + nextThreadNum(), 0);}

尾言

就算失望不能绝望,明天又去面试,美滋滋。

你应该会的一道多线程笔试题相关推荐

  1. 数位DP--由一道微软笔试题引起

    前天晚上,一位研三的学长突然跑到我们宿舍,问我们一道微软笔试题.给你一个整数n,求出1到n这个区间范围内包含数字0的个数,例如当n=10的时候就只有10包含0,输出1,n=90就输出9.唯一的要求是此 ...

  2. 多线程笔试题(linux)

    子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码. #include <stdio.h> # ...

  3. 出场率比较高的一道多线程安全面试题

    下面这个问题是 Java 程序员面试经常会遇到的吧. 工作一两年的应该都知道 ArrayList 是线程不安全的,要使用线程安全的就使用 Vector,这也是各种 Java 面试宝典里面所提及的,可能 ...

  4. 博彦科技软件测试工程师一道C笔试题

    测试空间旗下大头针出品 前段时间学员去笔试遇到的.  北京博彦科技一道C笔试 分别填入一个语句,完成下面的函数,通过递归计算数组a[100]的前n个数之和. int sum ( int a[],int ...

  5. 关于虚函数(多态)与继承的一道搜狗笔试题

    #include<iostream> using namespace std; /*Name: Copyright: Author: Date: 25/03/13 09:12Descrip ...

  6. 腾讯的一道链表笔试题【总结】

    出题的大致函数声明: node fun(node * head, int index),要我们实现函数里面的方法. 其中node是一个单向链表. 要实现的功能:返回倒数的第index个节点. 怎样优化 ...

  7. C++并发实战:面试题2:一道迅雷笔试题

    题目:编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示:如:ABCABC-.依次递推. 采用C++11实现: # ...

  8. 看到的一道阿里笔试题

    题目:考虑一个特殊的hash函数h,能将任一字符串hash成一个整数k,其概率p(k) = 2^(-k),k = 1,2,3,4,....对于一个未知大小的字符串集合S中的每一个元素取hash值所组成 ...

  9. 心血来潮之朋友的一道华为笔试题——德州扑克

    一副牌中的五张扑克牌, 牌型1:同花顺:同一花色的顺子 牌型2:四条:四张相同数字+单张 牌型3:葫芦:三张相同的数字+一对 牌型4:同花:同一花色 牌型5:顺子:花色不一样的顺子 牌型6:三条:三张 ...

  10. 2014-百度 阿里 华为笔试题

    8月15日,百度2道面试题: 1.来自<编程之美>的概率题:一个桶里面有白球.黑球各100个,现在按下述规则取球:的     i .每次从通里面拿出来两个球:     ii.如果取出的是两 ...

最新文章

  1. SimpleDateFormat 日期,时间格式转化
  2. java返回有什么用,java中的return this什么时候用,返回的是类里面的方法类型,还是实例类?上面的代码什么意思...
  3. python用表达式解密密文_基于Python解密仿射密码
  4. Jupyter notebook入门
  5. 使用 ssh 命令来访问(登录/连接)远程服务器主机
  6. attr和prop区别
  7. laravel小记(composer 安装和predis使用)
  8. JS中配置打开邮箱的链接
  9. 【STM32 .Net MF开发板学习-09】AD模拟量采集
  10. Java实现海报+二维码+二维码中间log+文字合并高清图片
  11. 要想Essay写得好,切记要警惕这六大禁区
  12. 基于百度翻译api的命令行翻译助手
  13. 图的点,边和度之间的关系
  14. 网络文学网站的盈利模式分析
  15. 获取UNIX主机当前时间的函数
  16. 易语言写64位魔兽世界游戏 寻路call 教程
  17. oracle如何导入一个用户,Oracle 把一个用户的数据导入另一个用户 (数据泵)
  18. openssl加密base64编码
  19. 2d加速 stm32_emWin做人机用户界面显示刷屏慢? 试试带2D图形加速的GUI图形屏
  20. system颜色函数

热门文章

  1. etf基金代码大全_ETF赚钱丨什么是ETF?知道这三点就入门了!
  2. 一阶导数和二阶导数的一些性质
  3. 【大咖来了】---中国HBase技术社区MeetUp
  4. 元宵节没用智能名片在互联网发贺卡,那就OUT了
  5. 大功率双路直流电机驱动板的设计源文件
  6. 友情链接对于网站来说有什么作用?
  7. unity3d游戏资源提取
  8. 如何进行支付流程及安全测试?
  9. eact native生成APP报错:You have not accepted the license agreements of the following SDK components:...
  10. VUE3 之 生命周期函数