前些日子面试阿里,其中有一笔试题如下:

补充如下程序通过N个线程顺序循环打印从0至100,如给定N=3则输出:

thread0: 0

thread1: 1

thread2: 2

thread0: 3

thread1: 4

...

注意线程号与输出顺序间的关系。

当拿到题之后,内心分析:大概知道该题是要考试Java里线程之间协作相关的知识

当时是这样写的:

package com.zhoufy.example.thread.communication;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;import org.apache.commons.lang3.StringUtils;public class ThreadDemo {private static int index = 1;private static int endValue = 100;private static AtomicInteger count = new AtomicInteger(0);private static ExecutorService executor = Executors.newFixedThreadPool(3);public static void main(String[] args) {boolean isLoop = true;while (isLoop) {if (count.get() > endValue) {isLoop = false;break;}executor.execute(new Runnable() {@Overridepublic void run() {try {if (count.get() > endValue) {return;}String name = Thread.currentThread().getName();int j = Integer.parseInt(StringUtils.substring(name, name.length() - 1, name.length()));if (j == index) {System.out.println("线程(" + Thread.currentThread().getName() + ")" + (count.getAndIncrement()));if (index == 3) {index = 1;} else {index++;}}} catch (Exception e) {e.printStackTrace();}}});}executor.shutdown();}
}

因为有时间的限制,所以写完测试了一下,就提交了,并没有进行优化,只是实现了题目的要求,其实自己并不满意!

事后还是想通过Java的wait、notify来实现的,所以自己又优化了一下:

package com.zhoufy.example.thread.communication;import java.util.concurrent.atomic.AtomicInteger;/*** 线程通信* * @author zhoufy* @date 2019年1月22日 下午5:35:51*/
public class ThreadCommunicationTest3 {private volatile AtomicInteger index = new AtomicInteger(1);public static void main(String[] args) {ThreadCommunicationTest3 t = new ThreadCommunicationTest3();t.test();}private void test(){Print m = new Print();new Thread1(m);new Thread2(m);new Thread3(m);}class Print{public synchronized void print(int remainder){if(index.get()%3==remainder){System.out.println(Thread.currentThread().getName()+":"+(index.get()-1));index.incrementAndGet();notifyAll();}if(index.get()<100){  //如果不加这一句,最后会有一个线程挂起try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}}class Thread1 implements Runnable {Print m;public Thread1(Print m1) {this.m = m1;new Thread(this, "Thread0").start();}public void run() {while(true){if(index.get()>100){break;}m.print(1);}}}class Thread2 implements Runnable {Print m;public Thread2(Print m2) {this.m = m2;new Thread(this, "Thread1").start();}public void run() {while(true){if(index.get()>100){break;}m.print(2);}}}class Thread3 implements Runnable {Print m;public Thread3(Print m3) {this.m = m3;new Thread(this, "Thread2").start();}public void run() {while(true){if(index.get()>100){break;}m.print(0);}}}
}

【阿里笔试题】线程篇相关推荐

  1. 阿里笔试题(2015)持续更新中

    第一次做阿里笔试题,除了ACM题之外从来没有做过校招网络题呀,完全是裸考,总体感觉吧,对于我来说,感觉时间不够用,不是题不会,感觉时间紧,大脑很混乱,总结这一次的笔试题 废话不多说,直接上题和答案 平 ...

  2. Android面试题线程篇

    Android面试题线程篇,由本人整理汇总,后续将推出系列篇,如果喜欢请持续关注和推荐. 开启线程的三种方式? java有三种创建线程的方式,分别是继承Thread类.实现Runable接口和使用线程 ...

  3. (更新时间)2021年5月18日 C#.NET笔试题 基础篇

    C#.NET笔试题 基础篇 文章目录 C#.NET笔试题 基础篇 1.C#中堆和栈的区别? 2.C#中的委托是什么?事件是不是一种委托? 3.C#静态构造函数特点是什么? 4.CTS.CLS.CLR分 ...

  4. 阿里笔试题:或运算的最小翻转次数 C++

    阿里笔试题:或运算的最小翻转次数 C++ 题目描述 输入输出示例 解题思路 代码 题目描述 给出一个数字n,表示有n组输入用例子,每一组输入给出三个正整数a.b.c,可以对a和b进行位翻转操作,每一次 ...

  5. java类初始化顺序-阿里笔试题

    阿里笔试题之写出程序输出结果: package com.patrick.bishi;public class TestVar {public static int k = 0;public stati ...

  6. 阿里笔试题第二题之-------容错技术

    阿里笔试题第二题之---容错技术 定义:容错就是当由于种种原因在系统中出现了数据.文件损坏或丢失时,系统能够自动将这些损坏或丢失的文件和数据恢复到发生事故以前的状态,使系统能够连续正常运行一种技术. ...

  7. 2020年3月25日阿里笔试题

    2020年3月25日阿里笔试题 题目描述一 python代码 题目描述二 求公差的python代码 处理上述情况的代码   仿佛人生总有一种魔咒,自己做的这场笔试题永远是最难的.不过今天的笔试题,真的 ...

  8. 2020年3月23日阿里笔试题

    2020年3月23日阿里笔试题 题目描述 题目分析   这是阿里的第二场笔试,本来觉得没啥好写的,一道排列组合,一道迷宫.没有什么发挥的空间.但是后来在和大家讨论的过程中,把这道题的公司给敲出来了,但 ...

  9. (更新时间)2021年5月18日 C#.NET笔试题 高级篇

    C#.NET笔试题 高级进阶篇 文章目录 C#.NET笔试题 高级进阶篇 1.说说什么是架构模式. 2.架构的5大要素是哪5大要素? 3.说说什么事集群,什么是分布式. 4.说说对Redis的理解 5 ...

最新文章

  1. oracle模块损坏,Oracle中模拟及修复数据块损坏
  2. OS / CPU是如何访问内存的?
  3. python123循环结构_来学Python啦,大话循环结构~
  4. 第十二届蓝桥杯Java省赛A组试题:异或数列
  5. 第一章-从双向链表学习设计
  6. 实例13:python
  7. 总裁导航V2.5.0-秒收录网站
  8. likeshop100%开源免费商用电商系统,PC商城、H5商城、小程序商城、安卓APP商城、苹果APP商城全部100%开源,免费商用
  9. java Stream 流
  10. java连接数据库的基本操作
  11. 阿里云安装kubernetes-UI报错endpoints \kubernetes-dashboard\ not found解决方法
  12. MySQL抽稀_Android GPS定位轨迹抽稀之道格拉斯-普克(Douglas-Peuker)算法详解
  13. python点击按钮窗口之间跳转_PyQt5点击按钮,实现界面之间的跳转思路
  14. Windows设置redis开启自动启动
  15. 什么是转义字符?转义字符有哪些?为什么使用转义字符?
  16. Ada2012即将完成
  17. 空间|时间|对象 圈人 + 目标人群透视 - 暨PostgreSQL 10与Greenplum的对比和选择
  18. Learn to say “fuck you” to the world every once in a while
  19. 中国文化产业基地(园区)投资战略规划与未来发展研究报告2021年版
  20. 内存数据库-H2简介与实践

热门文章

  1. 真王服务器文件,真王——后期快速升级心得
  2. 最完整二叉树删除节点
  3. 多序列比对要多久时间_ClustalW----多序列比对分析(一)
  4. 高效能管理之要事第一 时间管理表格
  5. win11耳机和扬声器怎么分开控制音量?
  6. arndale octa开发板编译u-boot和kernel
  7. 【山头斜照却相迎】初入计算机学习计划推荐
  8. 数据可视化,选择Echarts还是Highcharts?
  9. 海航控股公布重整计划 海航“航”向何方?
  10. ORA-12516解决