-2

我有一个需要提供快速分类服务的类。例如,我想编写像“classify("Ac Kd Kh 3c 3s")”这样快速返回 TWO_PAIR 的代码。(这不是应用程序,但你得到了 jist)

因为我需要快速分类,所以我想预先计算并存储一个查找表,其中列出了所有可能输入的分类输出。为了节省时间,我想并行化这个预计算。但是,尝试从第二个线程使用“classifySlowly”会产生死锁。

public class Classifcation Service {
  enum CLASS {TYPE_A, TYPE_B, ...};

  static CLASS[] preComputedClassLookUpTable;

  static {
    preComputedClassLookUpTable = constructLookUpTableInParallel();
  }

  //Note: using this method from with constructLookUpTableInParallel causes deadlock
  private static CLASS classifySlowly(Object classifyMe) {
    //do time intensive work to classify the input
    // -- uses no other methods from this class
    return classification;
  }

  public static CLASS classify(Object classifyMe) {
    //use the lookup table to do a quick classification
    return classification;
  }   
}

所以我的问题是:有没有办法从静态初始化程序块中预先计算并行中的这个查找表?

我看到的唯一(差)选择是从:

preComputedClassLookUpTable = constructLookUpTableInParallel();

到:

preComputeClassLookUpTable = loadLookUpTableFromFile();
if(preComputedClassLookUpTable == null) {
  System.out.println("WARNING:  Construction incomplete, Must call computeAndSaveLookUpTableFile();}
}

我认为这太多了,但这里是constructLookUpTableInParallel的实现

private static CLASS[] constructLookUpTableInParallel() {

  //build a collection of Runnables by iterating over all possible input Objects
  //wrap each possible input in an anonymous Runnable that calls classifySlowly.

  //submit the collection of Runnables to a new ExecutorService
  //process runnables...
  //shutdown executor service      
}

////////措辞不好的原始问题结束 ///////////

工作得有点干净的解决方案是将classifySlowly(ObjectclassifyMe) 和classify(ObjectclassifyMe) 方法分成两个不同的类。

这将允许包含“公共静态 CLASS 分类快速(对象分类我)”的(第二个)类需要使用分类慢速方法时完全加载包含“公共静态类分类快速(对象分类我)”的(第一个)类. 现在,第二个静态初始化块不需要任何自己的静态方法,它可以完全并行化。

4

1 回答 1

0

“所以我的问题是:有没有办法从静态初始化程序块中预先计算并行中的这个查找表?”

是的,几乎可以肯定有办法。只需新建数组并为每个数组元素启动一个 Runnable。给每个 Runnable 对数组的引用,并索引它正在计算的内容,然后让它在没有锁定的情况下进行计算,然后在将结果分配给数组元素时锁定。

注意/免责声明:此答案基于问题中给出的相当不完整的信息...

于 2012-10-23T15:46:16.823 回答