Java中的线程作业

时间:2010-05-19 17:48:13

标签: java multithreading

我想在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循环在第一组线程结束执行之前执行。

请告知

6 个答案:

答案 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使用,我很确定。

话虽这么说,我最近也有类似的工作要做;您可以使用ExecutorServicewait 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();