I am trying to learn multi-threading using the runnable interface but I am having some trouble figuring out how to pass information. Basically, in the example below, I want to remove the static reference from the Hashmap but if I do that, the program breaks. How do I pass the hashmap to the runnable interface class without using the static keyword?
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);
    
}
}
And a class that implements Runnable
public class threader implements Runnable {
ThreadDemo td = new ThreadDemo();
@Override
public void run() {
    
    synchronized(td.map) {
        td.addToMap(td.Hi());
        td.addToMap(td.Hello());
    }
    
    
}
}
 
    