如何正确实现 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.
因此 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.