0

我有一个具有三个线程和一个存储数据的哈希图的类。其中一个线程将数据写入 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();
  }
}

我希望第一个线程(编写器)运行第一个方法(写入),reader1 运行 read,reader 2 运行 readAll。但是我无论如何都找不到访问线程中的存储(运行方法)。如何编写线程以像这 3 种方法一样运行,同时它们都可以同时访问存储?

4

3 回答 3

2

首先,要使此类线程安全,您应该使用线程安全的哈希映射实现,java.util.concurrent.ConcurrentHashMap而不是普通的 old 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
  }
}
于 2012-07-24T23:16:29.823 回答
1

由于你的类是静态的,你可以简单地从线程的 run 方法调用collector.write。

于 2012-07-24T23:31:49.210 回答
0

使用该变量编写一个单例类,并使用 write、read、readAll 方法。看到您在storage对象上同步或同步方法。从三个线程访问这个单例类。

于 2012-07-24T23:16:15.023 回答