Java ExecutorService和更新常用的资源

Java ExecutorService和更新常用的资源,java,multithreading,data-processing,Java,Multithreading,Data Processing,我试图在数据数组上实现一个繁重的计算过程 为此,我使用Executor服务,在充分利用CPU的全部功能的同时,能够获得每次处理的结果 但是,我需要将从先前执行的线程获得的结果提供给处理数组的下一个线程,而不必等待所有线程终止 根据其他术语,共享资源数组是所有DATAItem对象的公共属性,它由每个线程(DATAItem对象)修改 我希望for循环中的下一个DATAItem对象(在这里被While循环代替)可以使用线程感知修改 int np = Runtime.getRuntime().ava

我试图在数据数组上实现一个繁重的计算过程

为此,我使用Executor服务,在充分利用CPU的全部功能的同时,能够获得每次处理的结果

但是,我需要将从先前执行的线程获得的结果提供给处理数组的下一个线程,而不必等待所有线程终止

根据其他术语,共享资源数组是所有DATAItem对象的公共属性,它由每个线程(DATAItem对象)修改

我希望for循环中的下一个DATAItem对象(在这里被While循环代替)可以使用线程感知修改

  int np = Runtime.getRuntime().availableProcessors();
  ExecutorService pool = new ThreadPoolExecutor(np-2, np-2, 5000,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
 // shared_ressource is the array of objects from class SharedRessource to be modified by each thread
    int i = 0;
    while (i<shared_ressource.size())
    {
        if (((ThreadPoolExecutor) pool).getActiveCount()<=(np-2) )
       {
         DATAItem di = new DATAItem();
         di.setSharedRessource(shared_ressource);

         Future<List<SharedRessource>> DataItemMod = pool.submit(di);
         // the Future's .get() method returns the modified shared_ressource array  
        i++;
       }
       else
           try {Thread.sleep(100);}
          catch (InterruptedException e) {e.printStackTrace();}

    }

         pool.shutdown();
int np=Runtime.getRuntime().availableProcessors();
ExecutorService pool=new ThreadPoolExecutor(np-2,np-2,5000,时间单位为毫秒,new LinkedBlockingQueue());
//shared_ressource是由每个线程修改的SharedResource类中的对象数组
int i=0;

虽然(i您计划进行顺序处理,因此即使您使用线程,第二个线程也不能与第一个线程并行处理,因为 它正在等待第一个终止。 也许您可以研究线程的连接特性,其中连接生成线程
等待另一个线程完成执行。

您对问题的描述需要一些工作。不清楚您是如何分割工作的。@Daniel Sperry我应该确切地解释什么?每个数据项(我想它是可调用的)的确切程度如何修改原始数组?就地?创建一个带有几个额外元素的新数组?如果它真的就地修改原始数组,那么如何防止弄乱其他数据项的输入?也许描述您的实际问题会有所帮助。