Java中的线程作业

bra*_*boy 4 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();
}
Run Code Online (Sandbox Code Playgroud)

注意:我故意将for循环放两次,但我想要的效果并不是因为第二个for循环在第一组线程结束执行之前执行.

请指教

unh*_*ler 17

您应该保留已创建的线程列表.然后,一旦启动了所有这些,您就可以循环遍历列表并对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
Run Code Online (Sandbox Code Playgroud)


Jus*_*tin 8

觉得家庭作业,但......

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();
 }
}
Run Code Online (Sandbox Code Playgroud)


Eti*_*nne 8

如果您使用的是Java 1.5,请使用并发软件包,如果您使用的是Java 1.4.2,那么该软件包仍可作为backport使用,我很确定.

话虽这么说,我最近也有类似的任务; 您可以使用ExecutorService轻松实现它,您可以从中等待Future对象返回以了解您的任务是否完整.非常干净的模式 - 也许不是你想要达到的目标,但在现实生活中它的效果非常好:-).

一些代码:

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
Run Code Online (Sandbox Code Playgroud)