Redian新闻
>
请教一个Java 线程池 和 main主线程如何和 协调?
avatar
请教一个Java 线程池 和 main主线程如何和 协调?# JobHunting - 待字闺中
s*e
1
碰到一个面试题:
如果使用Java线程池,比如ExecuteService线程池,有10个线程,这100个线程一起完
成一个任务。
主线程需要等待这个线程池中的100个线程完成后,再执行比如打印结果的任务。
如何让main主线程等待线程池的线程都完成任务后,再执行?
这个需求该如何实现?
我开始说,把主线程的优先级设的比较小,这样优先级就比较低了,但是这个答案不是
面试官期望的。
avatar
j*o
2
java的话用thread join吧
avatar
s*e
3
我也说了join了, 但是面试官说,这个也不现实,因为线程池的线程很多比如100个,
1000个。
有没有什么可以做flag判断的? 我说了一个也许可以使用callable接口,返回线程任
务的执行结果,根据这个判断来决定主线程是否应该执行。但是我自己后来回来的路上
想想,感觉好像也不对。

【在 j******o 的大作中提到】
: java的话用thread join吧
avatar
g*g
4
最简单就是返回一列Future,call get block在上面,其他常见的办法有 countdown
latch. join 是错误的,完成的是 task. 线程池还要继续跑。

【在 s********e 的大作中提到】
: 我也说了join了, 但是面试官说,这个也不现实,因为线程池的线程很多比如100个,
: 1000个。
: 有没有什么可以做flag判断的? 我说了一个也许可以使用callable接口,返回线程任
: 务的执行结果,根据这个判断来决定主线程是否应该执行。但是我自己后来回来的路上
: 想想,感觉好像也不对。

avatar
j*o
5
要不你用lock吧
avatar
e*a
6
countdownlatch
avatar
l*n
7
Lock是用来避免race condition的,用在这肯定不合适
用Future应该可行

【在 j******o 的大作中提到】
: 要不你用lock吧
avatar
W*g
8
BINGO

【在 e***a 的大作中提到】
: countdownlatch
avatar
w*z
9
+1, 我都是一个for loop 在future get

【在 g*****g 的大作中提到】
: 最简单就是返回一列Future,call get block在上面,其他常见的办法有 countdown
: latch. join 是错误的,完成的是 task. 线程池还要继续跑。

avatar
g*g
10
还有一些高大上的解法如RxJava或者相似的Reactive programming framework,弄个
subscriber在那计数也行。

【在 w**z 的大作中提到】
: +1, 我都是一个for loop 在future get
avatar
x*p
11
shutdown() + isTerminated()
avatar
m*k
12
coundownlatch la
avatar
m*k
13
no need if u do not need the result of the worker thead

【在 w**z 的大作中提到】
: +1, 我都是一个for loop 在future get
avatar
w*z
14
你不block 在future get,怎么知道那些thread 完成了?

【在 m*****k 的大作中提到】
: no need if u do not need the result of the worker thead
avatar
m*k
15
I mean just use countdownlatch,
no need to create future then future.get while not return and use its result.
又看了一下原帖,既然都用了ExecutorService,
那就awaitTermination 啦, I guess that is why interviewer mentioned 100 is
too much.

【在 w**z 的大作中提到】
: 你不block 在future get,怎么知道那些thread 完成了?
avatar
m*k
16
what if isTerminated() is still false? sleep and loop?
不太elegant吧.

【在 x*****p 的大作中提到】
: shutdown() + isTerminated()
avatar
p*2
17
用future就行了
100个future组成一个future
然后等待这个future就可以了
记住future就是monad 可以自由组合的

【在 s********e 的大作中提到】
: 碰到一个面试题:
: 如果使用Java线程池,比如ExecuteService线程池,有10个线程,这100个线程一起完
: 成一个任务。
: 主线程需要等待这个线程池中的100个线程完成后,再执行比如打印结果的任务。
: 如何让main主线程等待线程池的线程都完成任务后,再执行?
: 这个需求该如何实现?
: 我开始说,把主线程的优先级设的比较小,这样优先级就比较低了,但是这个答案不是
: 面试官期望的。

avatar
s*e
18
您好,请问 monad是什么意思?请指教,谢谢!

【在 p*****2 的大作中提到】
: 用future就行了
: 100个future组成一个future
: 然后等待这个future就可以了
: 记住future就是monad 可以自由组合的

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。