在java中通过3个线程访问变量

时间:2012-07-24 23:13:59

标签: java multithreading

我有一个有三个线程的类和一个存储数据的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。但我无论如何都无法在线程中访问存储(运行方法)。如何在这些方法同时访问存储的同时编写线程来运行这三种方法?

3 个答案:

答案 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对象上进行同步或同步方法。从三个线程中访问这个单例类。