是否可以在hashmap中存储线程对象?

时间:2017-03-16 10:35:24

标签: java multithreading collections concurrency core

我有一个场景,我调用了大约10 Thread个,每个Thread必须等到Notifier班级通知我想要通知特定的Thread,我是什么我正在使用HashMapThread ID为keyThread实例为值。稍后在Notifier我试图通过遍历提供map.get(threadId)实例的地图Thread来通知它,并且我尝试调用通知但是它正在抛出{{1} }}。我怀疑要同步IllegalmonitorExceptionHashMap类中的ThreadWaiter是什么..

Notifier

1 个答案:

答案 0 :(得分:0)

您的问题的答案是:。因为线程是一个对象,它可以存储到HashMap中。

另外,@ T.J.Crowder告诉你,你使用通知的方式是错误的。这是因为您正在调用通知没有线程锁定的对象map.get(entry.getKey()).notify();)。而不是你应该调用具有线程锁定的对象notifyRunner)的instance.notify(),代码会向我们显示:instance.wait();

首先!你必须使用instance方法对阻塞线程的对象wait进行同步,例如:

synchronized(instance){ 
  try{
    instance.wait() 
  }catch(...)
  {
     //Do Something else
  }
}

并且,调用对象notify的方法Runner来停止等待并继续线程并离开同步块,如下所示:

map.get(entry.getKey()).getRunnerInstance().notify();

但是,考虑到这一点,你当前的代码很难实现这个技巧,因为你必须重写几个部分,例如:你正在使用对象的代码,它存在于for循环的上下文中一个帖子

for (int i = 0; i < 2; i++) {

  Runner instance = new Runner();
  //...
  synchronized (map) {

            map.put(threadId, Thread.currentThread());

            try {
                instance.wait(); //You are blocking over a instance declared into the For Loop.
            }catch(..){
               //..
            };
  }

}