d****g 发帖数: 1049 | 1 正在学multithreading. 现在不知道该如何在主程序里
等待所有线程都结束以后再执行以后的程序段。比如说:
我有个主程序产生一个菜单,每个菜单项执行一堆线程。
(比如说是一个for loop生成10个线程,等待1秒后再生成10个线程.
这20个线程同时执行大量计算。
我怎么能在主程序里知道这堆线程全部完成了,然后再显示菜单?是不是
必须用join(), 并且是在所有线程生成以后再执行join()?
还是可以生成一个线程就join()?
可不可以用Thread.activeCount()来做并且避免busy waiting? | c*****t 发帖数: 1879 | 2
Join AFTER creating all the threads, since once you call join, the
current thread is blocked.
【在 d****g 的大作中提到】 : 正在学multithreading. 现在不知道该如何在主程序里 : 等待所有线程都结束以后再执行以后的程序段。比如说: : 我有个主程序产生一个菜单,每个菜单项执行一堆线程。 : (比如说是一个for loop生成10个线程,等待1秒后再生成10个线程. : 这20个线程同时执行大量计算。 : 我怎么能在主程序里知道这堆线程全部完成了,然后再显示菜单?是不是 : 必须用join(), 并且是在所有线程生成以后再执行join()? : 还是可以生成一个线程就join()? : 可不可以用Thread.activeCount()来做并且避免busy waiting?
| d****g 发帖数: 1049 | 3 thx.
但是如果有的线程已经完成了,调用join()会不会有什么
IllegalThreadStateException
之类的错误?
【在 c*****t 的大作中提到】 : : Join AFTER creating all the threads, since once you call join, the : current thread is blocked.
| c*****t 发帖数: 1879 | 4 shouldn't
【在 d****g 的大作中提到】 : thx. : 但是如果有的线程已经完成了,调用join()会不会有什么 : IllegalThreadStateException : 之类的错误?
| B*********h 发帖数: 800 | 5 you can use a CountDownLatch. it works like this:
1. in the main thread, you say I am going to count down from N.
2. in each of the N threads you want to create and run, count down the latch
at the end of run().
3. the mainthread blocks until the latch count is zero.
go check it out. but you can simply call join() as coconut pointed out.
【在 d****g 的大作中提到】 : 正在学multithreading. 现在不知道该如何在主程序里 : 等待所有线程都结束以后再执行以后的程序段。比如说: : 我有个主程序产生一个菜单,每个菜单项执行一堆线程。 : (比如说是一个for loop生成10个线程,等待1秒后再生成10个线程. : 这20个线程同时执行大量计算。 : 我怎么能在主程序里知道这堆线程全部完成了,然后再显示菜单?是不是 : 必须用join(), 并且是在所有线程生成以后再执行join()? : 还是可以生成一个线程就join()? : 可不可以用Thread.activeCount()来做并且避免busy waiting?
| d****g 发帖数: 1049 | 6 Thx BulletTooth and coconut.
我现在用join()。似乎运行正常。
可是在不同系统里我的程序表现非常不同。
我在我的XP Pro Sp2环境调试(java 1.5 updated),
程序运行结果是我预期的。
可是我把程序放到Solaris 10环境里,竟然运行
表现根产生死锁类似。程序要等很久才能进行线程运算。
比如说我分三次产生30个线程,每批10个,批间间隔3秒。
我用一个循环产生线程并start(). 设一个计数器到
10个线程都出现然后同时开始计算。全部30个线程产生
之后运行join(). 在我XP环境运行正常,第一批10个
生成以后可以探测到运行,然后是第二和第三批都正常。
可是弄到Solaris下感觉像是第一批产生以后等第二第
三批线程全部生成才大家一起运行计算。如果线程很多
等待要达到1-2分钟左右,就像死锁一样。但运算结果是对的。
不知道是怎么回事。
latch
【在 B*********h 的大作中提到】 : you can use a CountDownLatch. it works like this: : 1. in the main thread, you say I am going to count down from N. : 2. in each of the N threads you want to create and run, count down the latch : at the end of run(). : 3. the mainthread blocks until the latch count is zero. : go check it out. but you can simply call join() as coconut pointed out.
|
|