首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一简单线程同步笔试题分享,欢迎纠错分享更多思路

一简单线程同步笔试题分享,欢迎纠错分享更多思路

原创
作者头像
小金狗子
修改于 2020-07-28 09:59:29
修改于 2020-07-28 09:59:29
4260
举报

不知道出题人是否会对我分享该题有意见。

-------------------------

有线程:worker1、worker2 ,work1只能累加奇数、work2累加偶数,

请写出代码,实现两个线程交替累加至99中断,最终输出结果类似:

worker1:1+3=4 (奇数)

worker2:2+4=6 (偶数)

worker1:4+5=9(奇数)

worker2:6+6=12 (偶数)

(如果work1、work2其中一个线程累计和大于等于99时整体中断,并输出对应线程名及总和)

严格意义我并不觉得和线程同步相关。

个人在做题时答的稀烂,当然并不是不会。思路是有的,但是细节没有考虑好。作为java码农,没了IDE,纯手写也是头大。

出题人本意是希望用wait()/notify()来。我觉得还是偏复杂了。

在答题时我选择了用permits为1的Semaphore来实现。相对来说更简单。其中有一点没有考虑到的优化是要指定Semaphore

用公平锁。昨天想起来这题其实可以用Thread.yield()无锁化处理,当然带来的代价是线程会有不必要的执行。以下是代码:

代码语言:java
AI代码解释
复制
public class WorkSum {
  static volatile int step=1;
  static volatile boolean run=true;
  public static void main(String[] args){
    new Thread(()-> work("work1",(Integer a)-> a%2!=0)).start();
    new Thread(()-> work("work2",(Integer a)-> a%2==0)).start();
  }
  static void work(String name, Function<Integer,Boolean> checker){
    int sum=0;
    while(run&&sum<99){
      if(checker.apply(step)){
        System.out.println(name + " add "+ sum + "+" + step +"="+(sum+step));
        sum+=step;
        if(sum>=99){
          run=false;
          System.out.println(name + " get Sum"+ sum);
          break;
        }
        step++;
      }
      Thread.yield();
    }
  }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java基础教程(全代码解析)
掌握一门面向对象语言的语法 掌握面向对象的思维方式 熟悉面向对象设计原则 掌握面向对象设计模式
达达前端
2022/04/29
8720
Java基础教程(全代码解析)
还有年味的文章,ForkJoinPool 大型图文现场
并发工具类我们已经讲了很多,这些工具类的「目标」是让我们只关注任务本身,并且忽视线程间合作细节,简化了并发编程难度的同时,也增加了很多安全性。工具类的对使用者的「目标」虽然一致,但每一个工具类本身都有它独特的应用场景,比如:
用户4172423
2021/02/25
7250
还有年味的文章,ForkJoinPool 大型图文现场
线程,JVM锁整理
首先wait()和notify(),notifyAll()方法一定是一般对象方法,他们并不属于线程对象方法,一定是跟synchronized(监视器锁)结伴出现的。wait()方法执行时会释放获取的监视器锁,线程进入休眠等待状态。而notify()执行时,会随机唤醒一个等待状态的线程,并重新获取监视器锁,然后再继续执行。notifyAll()方法是唤醒所有的相同对象的等待线程,再去竞争获取监视器锁。
算法之名
2019/08/20
9890
《Java面试题集中营》- Java并发
Jdk提供了stop()方法用于强制停止线程,但官方并不建议使用,因为强制停止线程会导致线程使用的资源,比如文件描述符、网络连接处于不正常的状态。建议使用标志位的方式来终止线程,如果线程中有使用无限期的阻塞方式,比如wait()没有设置超时时间,就只能使用interrupt()方法来终止线程
阿提说说
2024/07/14
1450
阿里的面试题带你认识ForkJoinPool
随着在硬件上多核处理器的发展和广泛使用,并发编程成为程序员必须掌握的一门技术,在面试中也经常考查面试者并发相关的知识。
狼王编程
2021/06/01
5190
阿里的面试题带你认识ForkJoinPool
多线程进阶--JUC并发编程
https://blog.csdn.net/weixin_44502509/article/details/106872957
hhss
2021/02/12
6690
多线程进阶--JUC并发编程
java线程池(四):ForkJoinPool的使用及基本原理
在前面学习了ThreadpoolExecutor线程池之后,我们知道,ThreadPoolExecutor实际上是AbstractExecutorService的一个实现类。我们再看看AbstractExecutorService的实现类:
冬天里的懒猫
2020/09/24
18.1K0
java线程池(四):ForkJoinPool的使用及基本原理
Java多线程面试题,我丝毫不慌[通俗易懂]
进程我们估计是很了解的了,在windows下打开任务管理器,可以发现我们在操作系统上运行的程序都是进程:
全栈程序员站长
2022/08/01
4620
Java多线程面试题,我丝毫不慌[通俗易懂]
一次性把多线程搞吐
进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。
chengcheng222e
2021/11/04
4390
(juc系列)forkjoin框架源码学习
JUC系列提供的又一个线程池,采用分治思想,及工作窃取策略,能获得更高的并发性能.
呼延十
2021/10/18
5060
百度 阿里 华为 腾讯 谷歌面试笔试题及解析
点评:其余题目请参见:http://blog.csdn.net/doc_sgl/article/details/11695671。 2、一个有10亿条记录的文本文件,已按照关键字排好序存储。请设计算法,可以快速的从文件中查找指字关键字的记录。
bear_fish
2018/09/14
3.5K0
百度 阿里 华为 腾讯 谷歌面试笔试题及解析
Python 基础 (-)
Python 单词是“大蟒蛇”的意思。但是龟叔不是喜欢蟒蛇才起这个名字,而是正在追剧:英国电视喜剧片《蒙提·派森的飞行马戏团》(Monty Python and the Flying Circus)。
Dar_Alpha
2018/10/09
5.1K0
Java从入门到精通
为什么要配置 path:希望 Java 的开发工具在任何文件的文件路径下都可以执行成功
用户11332765
2024/10/28
5680
Java从入门到精通
Python面试题之Python面试题汇总
(1)与java相比:在很多方面,Python比Java要简单,比如java中所有变量必须声明才能使用,而Python不需要声明,用少量的代码构建出很多功能;(高效的高级数据结构)
Jetpropelledsnake21
2018/08/01
11.7K0
Python面试题之Python面试题汇总
UIUC CS241 讲义:众包系统编程书
欢迎来到 Angrave 的众包系统编程维基书!这个维基是由伊利诺伊大学的学生和教师共同建立的,是伊利诺伊大学 CS 的 Lawrence Angrave 的众包创作实验。
ApacheCN_飞龙
2024/01/12
9600
UIUC CS241 讲义:众包系统编程书
pyntho经典面试题
 (1)与java相比:在很多方面,Python比Java要简单,比如java中所有变量必须声明才能使用,而Python不需要声明,用少量的代码构建出很多功能;(高效的高级数据结构)
py3study
2020/01/17
3.3K0
一种绝对提高开发水平的方法
如果做了多年开发的你发现自己的水平一直上不去,你可能要提高自己的英文水平了,英语就是你技术的瓶颈,对有些人可能是硬伤。
张果
2018/07/31
9.4K2
一种绝对提高开发水平的方法
最全面、最详细web前端面试题及答案总结
本章是HTML考点的⾮重难点,因此我们采⽤简略回答的⽅式进⾏撰写,所以不会有太多详细的解释。我们约定,每个问题后我们标记『✨ 』的为⾼频⾯试题 doctype的作⽤是什么?✨ DOCTYPE是html5标准⽹⻚声明,且必须声明在HTML⽂档的第⼀⾏。来告知浏览器的解析器⽤什么⽂档标准解析这个 ⽂档,不同的渲染模式会影响到浏览器对于 CSS 代码甚⾄ JavaScript 脚本的解析 ⽂档解析类型有: BackCompat:怪异模式,浏览器使⽤⾃⼰的怪异模式解析渲染⻚⾯。(如果没有声明DOCTYPE,默认就是这个模式) CSS1Compat:标准模式,浏览器使⽤W3C的标准解析渲染⻚⾯。 IE8还有⼀种介乎于上述两者之间的近乎标准的模式,但是基本淘汰了。
全栈程序员站长
2022/08/01
8.4K0
相关推荐
Java基础教程(全代码解析)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档