我有一个有三个线程的类和一个存储数据的hashmap。其中一个线程将数据写入hashmap,另外两个读取它。像这样:
public static class collector{
Thread writter;
Thread reader1;
Thread reader2;
HashMap storage;
...
public void write(String s){
storage.put(s.hashcode(),s);
}
public String read(long hash){
return storage.get(hash);
}
public Set readAll(){
return storage.entrySet();
}
}
我希望第一个线程(writer)运行第一个方法(write),reader1运行read和reader 2运行readAll。但我无论如何都无法在线程中访问存储(运行方法)。如何在这些方法同时访问存储的同时编写线程来运行这三种方法?
答案 0 :(得分:2)
首先,为了使这个类是线程安全的,你应该使用线程安全的哈希映射实现,比如java.util.concurrent.ConcurrentHashMap
而不是普通的java.util.HashMap
。
另一张海报建议在单例中保存collector
实例,这相当于一个全局变量。我会将collector
实例传递给每个线程,而不是使用全局数据。您可以定义Runnable
的子类,它将collector
实例作为其构造函数的参数。将collector
存储在实例变量中。然后在run()
方法中使用它。当您启动线程时,为每个线程提供一个不同的Runnable
对象(使用相应的Thread
构造函数)。
类似的东西:
class MyTask implements Runnable {
private collector myCollector;
public MyTask(collector _myCollector) {
myCollector = _myCollector;
}
public void run() {
// do something with myCollector
}
}
答案 1 :(得分:1)
由于您的类是静态的,您只需从thread的run方法调用collector.write即可。
答案 2 :(得分:0)
用该变量和write,read,readAll方法编写单例类。看到您在storage
对象上进行同步或同步方法。从三个线程中访问这个单例类。