我有一个需要提供快速分类服务的类。例如,我想编写像“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 分类快速(对象分类我)”的(第二个)类需要使用分类慢速方法时完全加载包含“公共静态类分类快速(对象分类我)”的(第一个)类. 现在,第二个静态初始化块不需要任何自己的静态方法,它可以完全并行化。