并行运行100个线程,如果之前的某些线程已完成,则运行缺少的线程

Cla*_*ark 4 java parallel-processing multithreading

例如,我需要始终运行100个线程来执行某些操作.我有一个类调用ThreadsWorker,它会查找线程计数并运行缺少的线程,如果前面的一些完成.所以,这是描述情况的表:

1 second: 100 threads
2 second: 92 threads (ThreadsWorker generates new 8 threads)
3 second: 100 theads
4 second: 72 threads (ThreadsWorker generates 28 threads)
Run Code Online (Sandbox Code Playgroud)

等等.我的线程是匿名调用(只是new Thread(new Runnable(...)).start())因为我不知道如何正确地将它们保存到Threads[]数组中,因为虽然ThreadsWorker会保存threads[i] = new Threads(),但某些线程可能会完成,然后会与数组索引发生冲突.

由于匿名调用,我threadsCount现在使用变量并在线程体中开始递增它,并在线程体端减少(使用synchronized).好的,它工作正常,我的唯一方法是使用while()循环来检查threadsCount == 0进度是否完成.

我认为这是C风格但不是Java风格:)所以,你能帮我用Java方式做吗?

Mic*_*vis 6

如果您的目标只是让100个线程主动处理,我建议您查看Java 线程池(以及更常见的Executors).

我不清楚你是想要保持所有100个线程还是等待它们全部完成.你的问题引用了两个(ThreadsWorker产生28个新线程,threadsCount == 0),它们似乎是矛盾的.

  • +1用于为此而不是原始线程使用并发工具.有关样板代码,请参阅我的答案.http://stackoverflow.com/questions/5115940/how-to-use-executorservice-of-java-concurrent-programming/5116035#5116035 (2认同)

squ*_*ull 5

将所有线程放入数组或集合中.

然后循环遍历每个调用Thread.join()的集合.当此循环完成时,所有线程都完成.

ArrayList threads = new ArrayList();
for (int i = 0; i < 5; i++) {
  Thread t = new AweseomeThread();
  t.start();
  threads.add(t);
}

for (Thread t : threads) {
  t.join();
}
Run Code Online (Sandbox Code Playgroud)

您也需要一些异常处理(例如InterruptedException).但是,我会把它作为读者的练习...... :)