我想在Java中同时生成200个线程。我现在正在做的是进入循环并创建200个线程并启动它们。完成这200个后,我想生成另外200个线程,依此类推。
这里的要点是我产生的前200个线程需要在产生下一组之前完成。我尝试了下面的代码,但它无法正常工作
for(int i=0;i<200;i++){
Thread myThread = new Thread(runnableInstance);
myThread.start();
}
for(int i=0;i<200;i++){
Thread myThread = new Thread(runnableInstance);
myThread.start();
}
注意:我故意将for循环放两次,但我想要的效果并不是因为第二个for循环在第一组线程结束执行之前执行。
请告知
答案 0 :(得分:16)
您应该保留已创建的主题列表。然后,一旦启动了所有这些,您就可以遍历列表并在每个列表上执行join
。当join循环结束时,所有线程都将运行完成。
List<Thread> threads = new List<Thread>();
for(int i=0;i<200;i++){
Thread myThread = new Thread(runnableInstance);
myThread.start();
threads.add(myThread);
}
//All threads are running
for(Thread t : threads) {
t.join();
}
//All threads are done
答案 1 :(得分:7)
感觉像家一样,但是......
spawnAndWait() {
Thread T[] = new Thread[n];
for(int i=0;i<n;i++){
T[i] = new Thread(runnableInstance);
T[i].start();
}
for (Thread t : T) {
t.join();
}
}
答案 2 :(得分:7)
如果您使用的是Java 1.5,请使用并发软件包,如果您使用的是Java 1.4.2,该软件包仍然可以作为backport使用,我很确定。
话虽这么说,我最近也有类似的工作要做;您可以使用ExecutorService从wait on the Future object to return中轻松实现,以便了解您的任务是否完整。非常干净的模式 - 可能不是你想要达到的目标,但在现实生活中它的效果非常好: - )。
一些代码:
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
taskExecutor = new ThreadPoolExecutor(200, 200, 30, TimeUnit.SECONDS, workQueue);
futureList.add(taskExecutor.submit(new MyCallable()));
for (Future<Object> future : futureList) {
future.get(); // wait for the task to complete
}
//... instantiate your second group of executors
答案 3 :(得分:1)
伪代码排序,你无法实例化可调用;-)
while( moreThreads ) {
List<Callable<Integer>> threads = new ArrayList<Callable<Integer>>();
for( int i = 0; i < 200; ++i ) {
threads.add(new Callable<Integer>() );
}
FixedThreadPool pool = Executers.newFixedThreadPool(200);
pool.invokeAll(threads);
pool.shutdown();
}
答案 4 :(得分:0)
您需要使用join()
// run first set of threads
List<Thread> threads = threadsList; // save reference to all threads
for(Thread t : threads){
t.join();
}
// all threads finished
// run other set of threads
答案 5 :(得分:0)
另一个解决方案是使用Latch
final CountDownLatch latch = new CountDownLatch(200);
for(int i=0; i<10; i++)
{
Thread thread = new Thread()
{
public void run()
{
try{
//do your work
}finally{
latch.countDown();
}
}
};
}
//will block here util your threads all finished
latch.await();