你应该会的一道多线程笔试题
来源:互联网 发布:淘宝开店要求品牌注册 编辑:程序博客网 时间:2024/05/22 05:10
前言
最近也面了好多家企业,也总结到很多笔试经验和面试经验。笔试大多数Java题目都是牛客网原题和简单排序,数据库,
Java
基础概念,数据结构,MVC
模式等。面试官问的题目涉及的知识无非是Java
基础知识,设计模式,网络等。我发现出现频率很高的知识点有多线程,设计模式(单例模式,策略模式,观察者模式)等。今天就来说一下笔试和面试中常见的多线程题目。
笔试
- 题目:有
A
,B
,C
三个线程,,A
线程输出A
,B
线程输出B
,C
线程输出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; } @Override public 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; } @Override public 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; } @Override public 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; } @Override public 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); }
尾言
就算失望不能绝望,明天又去面试,美滋滋。
- 你应该会的一道多线程笔试题
- 一道多线程的笔试题
- 一道多线程笔试题
- 浅析一道多线程笔试题
- 一道腾讯多线程笔试题的问题和思考
- 一道多线程笔试题目的联想
- 一道关于笔试的多线程题目
- Cisco的一道笔试题
- 思科的一道笔试题
- 一道有趣的笔试题
- 华为的一道笔试题
- 一道简单的笔试题
- 一道经典的笔试题
- 广联达的一道笔试题
- ThoughtWorks 的一道笔试题
- NokiaSimens的一道笔试题
- 淘宝笔试的一道题
- 网易笔试的一道题
- 更精炼更专注的RTMPClient客户端EasyRTMPClient,满足直播、转发、分析等各种需求
- caffe学习笔记:mnist数据集的训练和测试
- Derby数据库使用方法
- mybaits中#{} ${}区别
- HDOJ2105 The Center of Gravity
- 你应该会的一道多线程笔试题
- C和指针之字符串简单实现 strcpy、strcat、strstr函数
- 织梦更新栏目出现500错误的解决办法
- VMware虚拟机三种联网方法及原理
- 人工智能神经网络算法零基础小白入门到高级实战必修之路精品教程
- Android如何解析json数组对象
- 148. Sort List
- 第七章 数据库设计 E-R模型
- JNI