繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM