Java多线程大型阵列访问
我的主类根据一些规则生成多个线程。(20-40个螺纹的寿命较长)。 每个线程创建几个线程(短时间)-->我正在使用executer来创建这个线程。 我需要在短时间线程-->中处理多维数组,就像在下面的代码-->中一样编写它,但我认为它没有效率,因为我将它传递给了这么多线程/任务--。我试图直接从线程访问它(通过将其声明为public-->未成功)--->我很乐意获得关于如何改进它的评论/建议。 我还研究了下一步返回一维数组的结果(在Assetfactory类中更新它可能更好)-->我不知道如何返回。 请参阅下面的代码。 谢谢 帕兹Java多线程大型阵列访问,java,arrays,multithreading,Java,Arrays,Multithreading,我的主类根据一些规则生成多个线程。(20-40个螺纹的寿命较长)。 每个线程创建几个线程(短时间)-->我正在使用executer来创建这个线程。 我需要在短时间线程-->中处理多维数组,就像在下面的代码-->中一样编写它,但我认为它没有效率,因为我将它传递给了这么多线程/任务--。我试图直接从线程访问它(通过将其声明为public-->未成功)--->我很乐意获得关于如何改进它的评论/建议。 我还研究了下一步返回一维数组的结果(在Assetfactory类中更新它可能更好)-->我不知道如何返
这里发生的一些事情似乎是错误的,但由于提供的代码数量有限,很难给出一个好的答案 首先是实际的编码问题:
- 如果只有一个线程访问变量(stop、feed),则无需将变量定义为volatile
- 您应该声明仅在该函数的本地上下文(run方法)中使用的变量,而不是整个实例(几乎所有变量)的全局变量。这允许JIT进行各种优化
- InterruptedException应该终止线程。因为它是作为终止线程工作的请求抛出的
- 在您的代码示例中,工作队列似乎什么都不做,只是让线程进入睡眠状态或停止它们。为什么它不立即向实际的工作线程提供所需的工作负载呢
- 您可以使用线程为线程提供工作。这是低效的,因为实际可以完成这项工作的内核数量有限。由于线程的执行顺序未定义,因此指示符很可能大部分处于空闲状态,或者被尚未完成的任务填满
- 如果您有一组有限的工作要做,则可能会对您的任务有所帮助
- 存在由某些数据源(例如文件流、网络)提供的任务阻塞队列
- 一组等于内核数量的工作线程正在等待该数据源输入,然后对其进行处理并放入完成队列
- 特定数据集是您工作的“终止符”(例如“空”)。如果线程遇到此终止符,它将完成循环并关闭
我希望这对您的案例有所帮助。这里发生的一些事情似乎是错误的,但由于提供的代码数量有限,很难给出一个好的答案 首先是实际的编码问题:
- 如果只有一个线程访问变量(stop、feed),则无需将变量定义为volatile
- 您应该声明仅在该函数的本地上下文(run方法)中使用的变量,而不是整个实例(几乎所有变量)的全局变量。这允许JIT进行各种优化
- InterruptedException应该终止线程。因为它是作为终止线程工作的请求抛出的
- 在您的代码示例中,工作队列似乎什么都不做,只是让线程进入睡眠状态或停止它们。为什么它不立即向实际的工作线程提供所需的工作负载呢
- 您可以使用线程为线程提供工作。这是低效的,因为实际可以完成这项工作的内核数量有限。由于线程的执行顺序未定义,因此指示符很可能大部分处于空闲状态,或者被尚未完成的任务填满
- 如果您有一组有限的工作要做,则可能会对您的任务有所帮助
- 存在由某些数据源(例如文件流、网络)提供的任务阻塞队列
- 一组等于内核数量的工作线程正在等待该数据源输入,然后对其进行处理并放入完成队列
- 特定数据集是您工作的“终止符”(例如“空”)。如果线程遇到此终止符,它将完成循环并关闭
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;
}