阿里的在线评测题:多线程打印数据

2023-05-16

我答的不好,那个伯乐在线评测系统不会用,本地写代码跑不成功挂了,总结下供后人参考。

  题目:


顺序递增打印正整数,从1开始打印到100,中间换行分隔。不允许重复打印出相同的数字,比如打印结果里出现2个5,3个6之类的。
要求如下:
1、使用三个线程A、B、C,其中线程A打印3的倍数,B打印5的倍数,C打印其他数字。  

这个题目还是比较考察多线程功力的,因为常规的加锁、或者使用join、countdownlantch等我熟悉的已经失效了。我尝试了使用condition的wait,notify来3个线程互相唤醒。还是出现了加锁异常的情况:java.lang.IllegalMonitorStateException。从难度上来看,也比常见的两个线程交替打印奇、偶数要复杂。

       咨询了13哥。他的公众号:互联网架构师养成计划,可以看看。主要整理的干货不怎么挂上来,私聊就有。

13哥给出方案是使用信号量:Semaphore。我之前没有用过,给我的印象就是类似限流使用的,

常见的方法就是:

 semaphore.acquire();获取许可,

semaphore.release();释放许可。

抢不到的情况下会被hold.效率很高。有更好的结果也可以反馈下。

贴一下代码:

/**
 * 
 * @author 13哥
 *
 */
public class ShowSemaphore {
	
	//计数器
    final static AtomicInteger count = new AtomicInteger(0);
    //信号量
    static Semaphore sp3 = new Semaphore(1);
    static Semaphore sp5 = new Semaphore(1);
    static Semaphore other = new Semaphore(1);
    
    public static void main(String[] args) {

        
    	Thread threadA  =new Thread(new Runnable() {
	        @Override
	        public void run() {
            while(true) {
                int p =  count.get();
                if(p>100){
                    break;
                }
                if((p % 3 == 0) && (p % 5 != 0)) {
                    sp3.acquireUninterruptibly();
                    System.out.println("threadA :" + p);
                    count.getAndIncrement();
                }
                sp5.release();
                other.release();
            }
        }
  	  });

  	Thread threadB   =new Thread(new Runnable() {
  		@Override
        public void run() {
            while(true) {
                int p =  count.get();
                if(p>100){
                    break;
                }
                if((p % 5 == 0) && (p % 3 != 0)) {
                    sp5.acquireUninterruptibly();
                    System.out.println("threadB : " + p);
                    count.getAndIncrement();
                }
                sp3.release();
                other.release();
            }
        }
  	});

  	Thread threadC   =new Thread(new Runnable() {
      		@Override
            public void run() {
            while(true) {
                int p = count.get();
                if(p>100){
                    break;
                }
                if(((p % 5 != 0) && (p % 3 != 0)||(p % 15 == 0))) {
                    other.acquireUninterruptibly();
                    System.out.println("threadc : " + p);
                    count.getAndIncrement();
                }
                sp3.release();
                sp5.release();
            }
        }
        });	

  	threadA.start();
  	threadB.start();
	threadC.start();
  		
  		
    }
    
}

输出结果:

threadc : 0
threadc : 1
threadc : 2
threadA :3
threadc : 4
threadB : 5
threadA :6
threadc : 7
threadc : 8
threadA :9
threadB : 10
threadc : 11
threadA :12
threadc : 13
threadc : 14
threadc : 15
threadc : 16
threadc : 17
threadA :18
threadc : 19
threadB : 20
threadA :21
threadc : 22
threadc : 23
threadA :24
threadB : 25
threadc : 26
threadA :27
threadc : 28
threadc : 29
threadc : 30
threadc : 31
threadc : 32
threadA :33
threadc : 34
threadB : 35
threadA :36
threadc : 37
threadc : 38
threadA :39
threadB : 40
threadc : 41
threadA :42
threadc : 43
threadc : 44
threadc : 45
threadc : 46
threadc : 47
threadA :48
threadc : 49
threadB : 50
threadA :51
threadc : 52
threadc : 53
threadA :54
threadB : 55
threadc : 56
threadA :57
threadc : 58
threadc : 59
threadc : 60
threadc : 61
threadc : 62
threadA :63
threadc : 64
threadB : 65
threadA :66
threadc : 67
threadc : 68
threadA :69
threadB : 70
threadc : 71
threadA :72
threadc : 73
threadc : 74
threadc : 75
threadc : 76
threadc : 77
threadA :78
threadc : 79
threadB : 80
threadA :81
threadc : 82
threadc : 83
threadA :84
threadB : 85
threadc : 86
threadA :87
threadc : 88
threadc : 89
threadc : 90
threadc : 91
threadc : 92
threadA :93
threadc : 94
threadB : 95
threadA :96
threadc : 97
threadc : 98
threadA :99
threadB : 100

还有个是常规日志输出的题目,不贴了。

常规的读文件,一行行的处理,截取URL,统计应该还OK。

要是日志很大,而且URL复杂(需要考虑放到内存处理比如map会爆掉的情况)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阿里的在线评测题:多线程打印数据 的相关文章

  • mysql8.0安装后设置密码

    mysql8 0安装后密码调整 创建密码策略 xff1a INSTALL COMPONENT file component validate password 查看是否创建成功 xff0c 执行后显示如下内容标识密码策略安装成功 属性值可修
  • C++读取文件夹中的文件

    下面是一种简便的读取文件夹里所有子文件夹和文件的方法 xff0c 如果想读取子文件夹下所有文件 xff0c 可以递归一下 span class token macro property span class token directive
  • 树莓4B+samba+nextcloud搭建nas私有云

    文章目录 概述环境准备网络机械硬盘格式化及分区 Samba安装部署nextCloud安装部署docker安装安装相关容器配置及优化创建数据库next cloud注册错误提示 xff1a nextcloud install Error whi
  • linux 配置java环境变量 报错 `=': 不是有效的标识符

    linux 配置java环境变量 运行source etc profile时 报错 96 61 39 不是有效的标识符 解决办法 export JAVA HOME 61 usr local java jdk1 8 0 151 的 61 左右
  • Word 自带公式转为mathtype格式

    选中公式 xff0c 在公式中 xff0c 选择LaTeX 复制后 xff0c 插入mathtype公式中
  • 从头用脚分析FFmpeg源码 - avcodec_send_frame | avcodec_receive_packet

    avcodec send frame和avcodec receive packet 作用 相对应avcodec send packet avcodec receive frame而言 xff0c avcodec send frame xff
  • Debian系统解决中文乱码问题

    1 安装locales apt get install locales 2 设置语言选项 dpkg reconfigure locales 选择如下四项 xff1a zh CN GB2312zh CN GBK GBKzh CN UTF 8
  • raspbian-buster安装php7.3

    安装php sudo apt get install php7 3 fpm php7 3 curl php7 3 gd php7 3 mbstring php7 3 mysql php7 3 imap php7 3 opcache php7
  • Linux下查看服务器各硬件信息

    span class hljs comment 内存 span span class hljs preprocessor free m span span class hljs preprocessor cat proc meminfo s
  • Day2、Hive json_tuple性能比get_json_object更高吗?为什么?

    目录 一 执行过程 二 源码比较 三 实验论证 四 总结 在对离线任务进行优化时 xff0c 一般来说有两种思路 一是参数优化 xff0c 尽量提高CPU 内存利用率 xff0c 或者减少spill率 xff1b 二是SQL优化 xff0c
  • Ubuntu18.04下更改apt源

    任意版本的系统代号 xff1a Ubuntu 12 04 LTS 代号为precise Ubuntu 14 04 LTS 代号为trusty Ubuntu 15 04 代号为vivid Ubuntu 15 10 代号为wily Ubuntu
  • C语言中数的二进制、八进制、十进制以及十六进制表示及输出

    以十进制数163为例 xff1a 二进制的英文是Binary xff0c 简写为B或BIN xff0c 所以163 61 0b10100011 xff08 前面加上 0b 或 0B xff09 八进制的英文是Octal xff0c 简写为O
  • java-字符串数组排序

    问题 43 代码 xff1a 创建一个长度是8的字符串数组 使用8个长度是5的随机字符串初始化这个数组 对这个数组进行排序 xff0c 按照每个字符串的首字母排序 无视大小写 注1 xff1a 不能使用Arrays sort 要自己写 注2
  • python 装饰器

    1 装饰器 装饰器 Decorators 是Python的一个重要部分 简单地说 xff1a 他们是修改其他函数的功能的函数 他们有助于让我们的代码更简短 xff0c 也更Pythonic xff08 Python范儿 xff09 大多数初
  • Java的俩个list之间比较,判断是否一致的方法

    前文 我看了一篇博客 xff0c 是关于判断俩个list的 看完之后我觉得可能并不是很好 结合他的思路 xff0c 我重新整理了一下代码 同时也看了看String中的equals的实现 原文是 xff1a https blog csdn n
  • ARP地址解析过程(同一子网和不同子网)

    人们最熟悉的网络可以说是以太网 xff0c 而且人们都知道 xff0c 每块网卡都有一个编号 xff0c 也就是网卡地址 xff08 称为MAC地址 xff09 xff0c 代表计算机的物理地址 另外 xff0c 网络中的每一台计算机都分配
  • (2)树莓派3B连接隐藏wifi网络

    连接隐藏wifi可以使用nano编辑器打开wpa supplicant配置文件 xff1a sudo nano etc wpa supplicant wpa supplicant conf 在文件底部添加 xff1a network 61
  • 获取本地外网ip的api接口

    开发时偶尔会需要前端传客户端的ip地址 xff0c 以下方法可以获取客户端外网ip 1 新增加载js方法 export const loadScript 61 src 61 gt return new Promise resolve rej
  • Ubuntu 18.04 配置ibus中文拼音输入法

    Ubuntu 18 04系统想安装中文输入法 xff08 利用ibus输入法配置 xff09 只要三步 注意 xff1a 你的Ubuntu需要可以上网 xff01 xff01 xff01 因为要下载一系列安装包 第一步 xff1a 首先需要
  • VMware安装Kali后黑屏 只有左上角光标

    在安装过程中选择安装GRUB引导程序 xff0c 默认是否 xff0c 我们需要选择是

随机推荐