-------------------------
有线程: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()无锁化处理,当然带来的代价是线程会有不必要的执行。以下是代码:
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 删除。