s********e 发帖数: 340 | 1 碰到一个面试题:
如果使用Java线程池,比如ExecuteService线程池,有10个线程,这100个线程一起完
成一个任务。
主线程需要等待这个线程池中的100个线程完成后,再执行比如打印结果的任务。
如何让main主线程等待线程池的线程都完成任务后,再执行?
这个需求该如何实现?
我开始说,把主线程的优先级设的比较小,这样优先级就比较低了,但是这个答案不是
面试官期望的。 |
j******o 发帖数: 4219 | |
s********e 发帖数: 340 | 3 我也说了join了, 但是面试官说,这个也不现实,因为线程池的线程很多比如100个,
1000个。
有没有什么可以做flag判断的? 我说了一个也许可以使用callable接口,返回线程任
务的执行结果,根据这个判断来决定主线程是否应该执行。但是我自己后来回来的路上
想想,感觉好像也不对。
【在 j******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : java的话用thread join吧
|
g*****g 发帖数: 34805 | 4 最简单就是返回一列Future,call get block在上面,其他常见的办法有 countdown
latch. join 是错误的,完成的是 task. 线程池还要继续跑。
【在 s********e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 我也说了join了, 但是面试官说,这个也不现实,因为线程池的线程很多比如100个, : 1000个。 : 有没有什么可以做flag判断的? 我说了一个也许可以使用callable接口,返回线程任 : 务的执行结果,根据这个判断来决定主线程是否应该执行。但是我自己后来回来的路上 : 想想,感觉好像也不对。
|
j******o 发帖数: 4219 | |
e***a 发帖数: 1661 | |
l**n 发帖数: 43 | 7 Lock是用来避免race condition的,用在这肯定不合适
用Future应该可行
【在 j******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 要不你用lock吧
|
W*******g 发帖数: 94 | 8 BINGO
【在 e***a 的大作中提到】![](/moin_static193/solenoid/img/up.png) : countdownlatch
|
w**z 发帖数: 8232 | 9 +1, 我都是一个for loop 在future get
【在 g*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 最简单就是返回一列Future,call get block在上面,其他常见的办法有 countdown : latch. join 是错误的,完成的是 task. 线程池还要继续跑。
|
g*****g 发帖数: 34805 | 10 还有一些高大上的解法如RxJava或者相似的Reactive programming framework,弄个
subscriber在那计数也行。
【在 w**z 的大作中提到】![](/moin_static193/solenoid/img/up.png) : +1, 我都是一个for loop 在future get
|
|
|
x*****p 发帖数: 1707 | 11 shutdown() + isTerminated() |
m*****k 发帖数: 731 | |
m*****k 发帖数: 731 | 13 no need if u do not need the result of the worker thead
【在 w**z 的大作中提到】![](/moin_static193/solenoid/img/up.png) : +1, 我都是一个for loop 在future get
|
w**z 发帖数: 8232 | 14 你不block 在future get,怎么知道那些thread 完成了?
【在 m*****k 的大作中提到】![](/moin_static193/solenoid/img/up.png) : no need if u do not need the result of the worker thead
|
m*****k 发帖数: 731 | 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 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 你不block 在future get,怎么知道那些thread 完成了?
|
m*****k 发帖数: 731 | 16 what if isTerminated() is still false? sleep and loop?
不太elegant吧.
【在 x*****p 的大作中提到】![](/moin_static193/solenoid/img/up.png) : shutdown() + isTerminated()
|
p*****2 发帖数: 21240 | 17 用future就行了
100个future组成一个future
然后等待这个future就可以了
记住future就是monad 可以自由组合的
【在 s********e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 碰到一个面试题: : 如果使用Java线程池,比如ExecuteService线程池,有10个线程,这100个线程一起完 : 成一个任务。 : 主线程需要等待这个线程池中的100个线程完成后,再执行比如打印结果的任务。 : 如何让main主线程等待线程池的线程都完成任务后,再执行? : 这个需求该如何实现? : 我开始说,把主线程的优先级设的比较小,这样优先级就比较低了,但是这个答案不是 : 面试官期望的。
|
s********e 发帖数: 340 | 18 您好,请问 monad是什么意思?请指教,谢谢!
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 用future就行了 : 100个future组成一个future : 然后等待这个future就可以了 : 记住future就是monad 可以自由组合的
|
p*****2 发帖数: 21240 | |