如何将一个巨大的循环划分为多个线程,然后将结果添加到集合中?

时间:2017-06-01 10:53:19

标签: multithreading java-6

我正在循环中执行某项任务。我需要将这个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;
}

1 个答案:

答案 0 :(得分:0)

我不知道您使用的Java版本,但在Java 7及更高版本中,您可以使用Fork / Join ForkJoinPool

基本上,

  

在Java 7中引入的Fork / Join并不打算替换或竞争   使用现有的并发实用程序类;相反,它更新和   完成它们。 Fork / Join解决了分而治之的需要,   或Java程序中的递归任务处理(请参阅参考资料)。

     

Fork / Join的逻辑非常简单:(1)分离(fork)每个大任务   进入较小的任务; (2)在一个单独的线程中处理每个任务   (必要时将它们分成更小的任务); (3)加入   结果

Citation

网上有各种example可以帮助它。我自己还没有用过它。

我希望这会有所帮助。

对于Java6,您可以按照related SO question

进行操作