求一个 Java 面试题的最佳实践

2021-01-25 12:24:37 +08:00
 Cbdy

三个线程,分别输出 a 、b 、c,各输出 100 次,要求按 abc 的顺序输出

期待输出为:abcabcabcabc...

4457 次点击
所在节点    Java
48 条回复
YoongRii
2021-01-25 17:14:22 +08:00
用原子变量%3 这种解法比较常见,但是需要线程忙等,提供一种用线程池方式实现的思路:

public static void main(String[] args) throws InterruptedException {
ExecutorService executorService1 = Executors.newSingleThreadExecutor();
ExecutorService executorService2 = Executors.newSingleThreadExecutor();
ExecutorService executorService3 = Executors.newSingleThreadExecutor();

Runnable[] rs = new Runnable[3];

rs[0] = () -> {
System.out.println("A");
executorService2.submit(rs[1]);
};

rs[1] = () -> {
System.out.println("B");
executorService2.submit(rs[2]);
};

rs[2] = new Runnable() {
private int a = 1;

public void run() {
System.out.println("C");
if (a++ < 100)
executorService3.submit(rs[0]);
}
};

executorService1.submit(rs[0]);
}
donggexiongdi
2021-01-25 17:19:22 +08:00
public void printAbc(int count) {
for (int i = 0; i < count; i++) {
CompletableFuture.runAsync(() -> {
System.out.println("A");
}).thenRun(() -> {
System.out.println("B");
}).thenRun(() -> {
System.out.println("C");
});
System.out.println("-------");
}
}
donggexiongdi
2021-01-25 17:22:06 +08:00
我擦 不对
cubecube
2021-01-26 01:26:51 +08:00
@sampeng
1.队列也需要锁,无锁队列的话,如果某个线程输入太慢,跟不上,consumer 也得等待?
2.另外,题目说得三个线程个,consumer 还得偷线程或者揉进到生产者线程的执行过程中。

以上条件要全写对,比状态量的复杂。
sampeng
2021-01-26 09:34:19 +08:00
@cubecube
1.我说的无所锁方案是代码不需要明确的写锁的逻辑。也是一个比较自然的做法。而且队列的这种方式并没有资源竞争,只是 consumer 等待而已。
2.三个线程难道就不能有主线程了?谁起的这 3 个线程呢?当然是主线程上直接循环啊。又不是生产环境。
Vendettar
2021-01-26 11:04:01 +08:00
@Cyron 三个线程首次启动抢锁的话(3 线程都没有 sleep 过),a 抢 1b 抢 2 就没问题,如果 b 抢 1 那后面 99 次都是 b 先输出了
fantastM
2021-01-27 14:30:52 +08:00
#10 说的方案是可行的,并且是基于 CAS 无锁的

https://gist.github.com/fantasticmao/f78ae0016a81877cf5019d9c22c81c73
SkyLine7
2021-02-02 11:26:02 +08:00
@woshiaha 是的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/748114

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX