如何正确实现 Runnable 来搜索哈希表中的元素?

How to correctly implement Runnable for searching an element in a Hashtable?

因此 ArrayList "comb" 包含等长的字符串和一些字符的变体。在最坏的情况下,这个列表可以包含大约 100,000 个单词。函数 checkWord(String str) 以一个单词作为参数,并检查该单词是否存在于 Hashtable 字典中(其中包含另外 90,000~ 个单词,一个文本文件被读入此 hashtable ).所以基本上代码需要检查哈希表 "dictionary" 中存在列表 "comb" 中的哪些单词。在最坏的情况下,此搜索最多需要 5 分钟。我想实现 Runnable 并将其并行化,但不确定如何去做。

例如:列表梳包含CURMUDGEON 的各种拼写错误和正确的单词本身。此列表包含其中的 98415 个。 CURMUEGEON CURMUEGEOH CURMUEGEOJ CURMUEGEKN 等等。因此,检查这些单词中的每一个是否出现在散列 table 中需要 200 秒。这次我要打倒

class key implements Runnable{
    public static ArrayList<String> comb;
    public static Hashtable<String,String> dictionary; 
    public static void main(String[] args) throws IOException{
        key obj = new key();
        Thread thread1 = new Thread(obj);
        thread1.start();
    }
    public static Boolean checkWord(String str){
                String toCheck = str.toLowerCase();
                if(dictionary.contains(toCheck)){
                    return true;
                }
                else
                 return false;
      }
        public void run(){
            for(String x:comb)
                if ( checkWord(x) )
                    filtered.add(x);

        }

为了提高效率,您需要多个 Runnable 来独立测试梳状列表的不同范围,例如

public class MySearcher implements Runnable {
  ArrayList list;
  int startIdx, endIdx;
  public MySearcher(list, startIdx, endIdx) {
    // copy into object fields
  }
  public void run () {
    // test all values in the list between startIdx and endIdx
    // put results into a data structure. Create a method to get/return that data structure
  }
}

然后您可以为所有的 Runnable 使用 ExecutorService(有关用法,请参阅 javadoc:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html

HashTable 是遗留的 JDK1.0 API class 具有非常强大的并发保证。在 particular

Unlike the new collection implementations, Hashtable is synchronized.

这意味着对Hashtable的每一次操作都需要获取监视器锁,对于重复查找来说是性能杀手。最好遵循 JDK javadocs:

中给出的建议

If a thread-safe implementation is not needed, it is recommended to use HashMap in place of Hashtable. If a thread-safe highly-concurrent implementation is desired, then it is recommended to use ConcurrentHashMap in place of Hashtable.