前言
最近面试遇到一道简单的多线程编码题,线程交替打印的升级版,我们来研究下这道题怎么解决。
题目介绍:
线程A每次处理只能输出一个A
线程B每次输出只能输出一个B
主线程不能输出A或B
请尽可能不使用封装好的工具方法或类来调度线程,然后输出以下内容:
ABBBBABBBBABBBBABBBB….
加分项:增加线程B1,行为和B一样,要求B和B1负载均衡
题目解析
输出一个A然后输出4个B,以此类推,最简单的应该是使用synchronized,wait以及notify方法来实现,这里可以指定一个自增的整数,能被5整除时打印A,不能被5整除时打印B,话不多说我们来看代码。
使用synchronized、wait、notify方法
非负载均衡
这里我们先不考虑B1的负载均衡,简单实现如下:
1 | public class ThreadTest { |
我们来看下输出结果:
1 | ABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBA |
负载均衡如何实现?
如果考虑题目里的负载均衡应该怎么做呢?其实也很简单,增加另一个标志位就可以了,判断index能否被5整除的时候顺便判断下标志位是否是当前线程的标志位即可(个人理解,如有错误还请指正),上代码:
1 | public class ThreadTest { |
看下效果:
1 | AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1AB0B1B0B1A |