[英]Accessing a variable by 3 threads in java
我有一个具有三个线程的类和一个存储数据的哈希表。 其中一个线程将数据写入哈希映射,另外两个线程读取数据。 像这样:
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();
}
}
我希望第一个线程(写入器)运行第一个方法(写入),而reader1运行读取,而Reader 2运行readAll。 但是我还是找不到访问线程中的存储的方法(运行方法)。 当它们都可以同时访问存储时,如何编写线程来像这三种方法一样运行?
首先,要使此类具有线程安全性,应使用线程安全的哈希映射实现,例如java.util.concurrent.ConcurrentHashMap
而不是普通的java.util.HashMap
。
另一位发布者建议将collector
实例放在一个单例中,这等效于全局变量。 与其使用全局数据,不如将collector
实例传递到每个线程中。 您可以定义Runnable
的子类,该子类将collector
实例作为其构造函数的参数。 将collector
存储在实例变量中。 然后从run()
方法中使用它。 启动线程时,为每个Thread
分配一个不同的Runnable
对象(使用适当的Thread
构造函数)。
就像是:
class MyTask implements Runnable {
private collector myCollector;
public MyTask(collector _myCollector) {
myCollector = _myCollector;
}
public void run() {
// do something with myCollector
}
}
由于您的类是静态的,因此您可以简单地从线程的run方法中调用collector.write。
用该变量编写一个单例类,并编写,读取和读取所有方法。 看到您在storage
对象上同步或同步了方法。 从三个线程访问此单例类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.