Java多线程大型阵列访问

Java多线程大型阵列访问,java,arrays,multithreading,Java,Arrays,Multithreading,我的主类根据一些规则生成多个线程。(20-40个螺纹的寿命较长)。 每个线程创建几个线程(短时间)-->我正在使用executer来创建这个线程。 我需要在短时间线程-->中处理多维数组,就像在下面的代码-->中一样编写它,但我认为它没有效率,因为我将它传递给了这么多线程/任务--。我试图直接从线程访问它(通过将其声明为public-->未成功)--->我很乐意获得关于如何改进它的评论/建议。 我还研究了下一步返回一维数组的结果(在Assetfactory类中更新它可能更好)-->我不知道如何返

我的主类根据一些规则生成多个线程。(20-40个螺纹的寿命较长)。 每个线程创建几个线程(短时间)-->我正在使用executer来创建这个线程。 我需要在短时间线程-->中处理多维数组,就像在下面的代码-->中一样编写它,但我认为它没有效率,因为我将它传递给了这么多线程/任务--。我试图直接从线程访问它(通过将其声明为public-->未成功)--->我很乐意获得关于如何改进它的评论/建议。 我还研究了下一步返回一维数组的结果(在Assetfactory类中更新它可能更好)-->我不知道如何返回。 请参阅下面的代码。 谢谢 帕兹


这里发生的一些事情似乎是错误的,但由于提供的代码数量有限,很难给出一个好的答案

首先是实际的编码问题:

  • 如果只有一个线程访问变量(stop、feed),则无需将变量定义为volatile

  • 您应该声明仅在该函数的本地上下文(run方法)中使用的变量,而不是整个实例(几乎所有变量)的全局变量。这允许JIT进行各种优化

  • InterruptedException应该终止线程。因为它是作为终止线程工作的请求抛出的

  • 在您的代码示例中,工作队列似乎什么都不做,只是让线程进入睡眠状态或停止它们。为什么它不立即向实际的工作线程提供所需的工作负载呢

然后是代码结构问题:

  • 您可以使用线程为线程提供工作。这是低效的,因为实际可以完成这项工作的内核数量有限。由于线程的执行顺序未定义,因此指示符很可能大部分处于空闲状态,或者被尚未完成的任务填满

  • 如果您有一组有限的工作要做,则可能会对您的任务有所帮助

我认为通过重新设计代码结构,您将获得最佳的速度提升。想象一下(假设我正确理解了你的问题):

  • 存在由某些数据源(例如文件流、网络)提供的任务阻塞队列

  • 一组等于内核数量的工作线程正在等待该数据源输入,然后对其进行处理并放入完成队列

  • 特定数据集是您工作的“终止符”(例如“空”)。如果线程遇到此终止符,它将完成循环并关闭

现在,以下内容适用于此构造:

案例1:数据源是瓶颈。使用多个线程无法提高速度,因为如果您要求的频率更高,硬盘/网络的工作速度也不会更快

案例2:您机器上的处理能力是瓶颈,因为您无法处理超过机器上工作线程/内核所能处理的数据

在这两种情况下,结论都是,工作线程需要在准备处理新数据时立即寻找新数据。因为它们要么需要暂停,要么需要限制传入的数据。这将确保最大吞吐量

如果所有工作线程都已终止,则工作已完成。这可以通过使用或类来跟踪

工作线程的伪代码:


我希望这对您的案例有所帮助。

这里发生的一些事情似乎是错误的,但由于提供的代码数量有限,很难给出一个好的答案

首先是实际的编码问题:

  • 如果只有一个线程访问变量(stop、feed),则无需将变量定义为volatile

  • 您应该声明仅在该函数的本地上下文(run方法)中使用的变量,而不是整个实例(几乎所有变量)的全局变量。这允许JIT进行各种优化

  • InterruptedException应该终止线程。因为它是作为终止线程工作的请求抛出的

  • 在您的代码示例中,工作队列似乎什么都不做,只是让线程进入睡眠状态或停止它们。为什么它不立即向实际的工作线程提供所需的工作负载呢

然后是代码结构问题:

  • 您可以使用线程为线程提供工作。这是低效的,因为实际可以完成这项工作的内核数量有限。由于线程的执行顺序未定义,因此指示符很可能大部分处于空闲状态,或者被尚未完成的任务填满

  • 如果您有一组有限的工作要做,则可能会对您的任务有所帮助

我认为通过重新设计代码结构,您将获得最佳的速度提升。想象一下(假设我正确理解了你的问题):

  • 存在由某些数据源(例如文件流、网络)提供的任务阻塞队列

  • 一组等于内核数量的工作线程正在等待该数据源输入,然后对其进行处理并放入完成队列

  • 特定数据集是您工作的“终止符”(例如“空”)。如果线程遇到此终止符,它将完成循环并关闭

现在,以下内容适用于此构造:

案例1:数据源是瓶颈。使用多个线程无法提高速度,因为如果您要求的频率更高,硬盘/网络的工作速度也不会更快

案例2:您机器上的处理能力是瓶颈,因为您无法处理的数据超过您机器上的工作线程/内核
import java.util.concurrent.*;
import java.util.logging.Level;

public class AssetFactory implements Runnable{
    private volatile boolean stop = false;
    private volatile String feed ;
    private double[][][] PeriodRates= new double[10][500][4];

    private String TimeStr,Bid,periodicalRateIndicator;
    private final BlockingQueue<String> workQueue;
    ExecutorService IndicatorPool = Executors.newCachedThreadPool();

    public AssetFactory(BlockingQueue<String> workQueue) {
      this.workQueue = workQueue;
    }   

    @Override
    public void run(){
      while (!stop) {
       try{   
          feed = workQueue.take(); 
            periodicalRateIndicator = CheckPeriod(TimeStr, Bid) ;
            if (periodicalRateIndicator.length() >0) {
                IndicatorPool.submit(new CalcMvg(periodicalRateIndicator,PeriodRates));
            } 

          } 

          if ("Stop".equals(feed)) {
              stop = true ;
          }

       } // try
       catch (InterruptedException ex) {
           logger.log(Level.SEVERE, null, ex);
           stop = true;
       }


      } // while
    } // run  
public class CalcMvg implements Runnable {
    private double [][][] PeriodRates = new double[10][500][4];

    public CalcMvg(String Periods, double[][][] PeriodRates) {
        System.out.println(Periods); 
        this.PeriodRates = PeriodRates ;
    }

    @Override
    public void run(){
       try{
          // do some work with the data of PeriodRates array e.g. print it (no changes to array
          System.out.println(PeriodRates[1][1][1]);
          }
       catch (Exception ex){
          System.out.println(Thread.currentThread().getName() + ex.getMessage());
          logger.log(Level.SEVERE, null, ex);
         }
      }//run

  } // mvg class
public void run() {
  DataType e;
  try {
    while ((e = dataSource.next()) != null) {
      process(e);
    }
    barrier.await();
  } catch (InterruptedException ex) {
  }
}
private final double [][][] PeriodRates;

public CalcMvg(String Periods, double[][][] PeriodRates) {
    System.out.println(Periods); 
    this.PeriodRates = PeriodRates;
}
private double[] result = null;

private synchronized void setResult(double[] result) {
    this.result = result;
}

public synchronized double[] getResult() {
    if (result == null) {
        throw new RuntimeException("Result has not been initialized for this instance: " + this);
    }

    return result;
}