我正在循环中执行某项任务。我需要将这个120万的循环划分为多个线程。每个线程都会在列表中有一些结果。当所有线程都完成后,我需要将所有线程列表数据添加到一个公共列表中。我不能使用ExecutorService。我怎么能这样做?
它应与jdk 1.6兼容。
这就是我现在正在做的事情:
List<Thread> threads = new ArrayList<Thread>();
int elements = 1200000;
public void function1() {
int oneTheadElemCount = 10000;
float fnum_threads = (float)elements / (float)oneTheadElemCount ;
String s = String.valueOf(fnum_threads);
int num_threads = Integer.parseInt(s.substring(0, s.indexOf("."))) + 1 ;
for(int count =0 ; count < num_threads ; count++) {
int endIndex = ((oneTheadElemCount * (num_threads - count)) + 1000) ;
int startindex = endIndex - oneTheadElemCount ;
if(count == (num_threads-1) )
{
startindex = 0;
}
if(startindex == 0 && endIndex > elements) {
endIndex = elements -1 ;
}
dothis( startindex,endIndex);
}
for(Thread t : threads) {
t.run();
}
}
public List dothis(int startindex, int endIndex) throws Exception {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = startindex;
(i < endIndex && (startindex < elements && elements) ) ; i++)
{
//task adding elements in list
}
}
});
thread.start();
threads.add(thread);
return list;
}
答案 0 :(得分:0)
我不知道您使用的Java版本,但在Java 7及更高版本中,您可以使用Fork / Join ForkJoinPool
。
基本上,
在Java 7中引入的Fork / Join并不打算替换或竞争 使用现有的并发实用程序类;相反,它更新和 完成它们。 Fork / Join解决了分而治之的需要, 或Java程序中的递归任务处理(请参阅参考资料)。
Fork / Join的逻辑非常简单:(1)分离(fork)每个大任务 进入较小的任务; (2)在一个单独的线程中处理每个任务 (必要时将它们分成更小的任务); (3)加入 结果
网上有各种example可以帮助它。我自己还没有用过它。
我希望这会有所帮助。
对于Java6,您可以按照related SO question。
进行操作