无静态引用的Java可运行

无静态引用的Java可运行,java,multithreading,runnable,Java,Multithreading,Runnable,我正在尝试使用runnable接口学习多线程,但在理解如何传递信息时遇到了一些问题。基本上,在下面的示例中,我想从Hashmap中删除静态引用,但如果这样做,程序就会中断。如何在不使用static关键字的情况下将hashmap传递给runnable接口类 public class ThreadDemo { static HashMap <String, Integer>map = new HashMap<>(); public String Hi() { re

我正在尝试使用runnable接口学习多线程,但在理解如何传递信息时遇到了一些问题。基本上,在下面的示例中,我想从Hashmap中删除静态引用,但如果这样做,程序就会中断。如何在不使用static关键字的情况下将hashmap传递给runnable接口类

public class ThreadDemo {

static HashMap <String, Integer>map = new HashMap<>();

public String Hi() {
    return "hi";
}

public String Hello() {
    return "Hello";
}

public void addToMap(String item) {
    if (map.containsKey(item)) {
        map.put(item, map.get(item) + 1);
    } else {
        map.put(item, 1);
    }
}


public static void main(String[] args) throws InterruptedException {

    ArrayList<Thread> all = new ArrayList<>();
    
    for (int i = 0; i < 50; ++i) {
        threader threader = new threader();
        all.add(new Thread(threader));
    }

    for (Thread thread : all) {
        thread.start();
    }
    
    for (Thread thread : all) {
        thread.join();
    }
    
    ThreadDemo td = new ThreadDemo();
    System.out.println(td.map);

    
}

}类实例是关于信息的

public class threader implements Runnable {
   final private ThreadDemo td;

   public threader(ThreadDemo td) {
      this.td = td;
   }

   @Override
   public void run() {
     ..
   }

}
然后使用(细节省略,只是想法):

当然,所有线程都使用相同的ThreadDemo和相同的映射,因此您需要确保访问以某种方式进行联锁,例如,使用
synchronized
。在本例中,应该同步
ThreadDemo.addToMap
方法,而不是
addToMap
的调用者。这将“保管地图”的责任放在了实际拥有地图的地方,因此是一种更好的设计


我选择共享ThreadDemo而不仅仅是ThreadDemo中的地图,因为在我看来ThreadDemo的目的只是作为地图的包装。

与您的要求无关,但仅供参考,拥有多个线程是毫无意义的,如果线程所做的一切都在一个
同步的
块中…了解它是如何断开的,或者它断开时的输出是什么是很有帮助的。这会输出一个如下的hashmap:{hi=50,Hello=50}但不输出static关键字{}查看java关键字。您可以在
线程器的构造函数中传递对象。您可以解释为什么需要同步addToMap方法吗?只有一个哈希映射。地图同时被50个线程访问。这说明它不是线程安全的。因此,我们必须安排在ant时间内只有一个线程实际接触地图。唯一涉及映射的代码是addToMap,因此最简单的解决方案(假设我们有该映射)是使addToMap同步-这意味着一次只在其中执行一个线程。我可能不清楚我的意思是同步addToMap而不是addToMap的调用者。我更新了我的答案以添加细节。
public class threader implements Runnable {
   final private ThreadDemo td;

   public threader(ThreadDemo td) {
      this.td = td;
   }

   @Override
   public void run() {
     ..
   }

}
ThreadDemo theTd = new ThreadDemo();
for (...) {
    threader threader = new threader(theTd);
    all.add(new Thread(threader));
}

....