我有一个场景,我调用了大约10 Thread
个,每个Thread
必须等到Notifier
班级通知我想要通知特定的Thread
,我是什么我正在使用HashMap
,Thread
ID为key
,Thread
实例为值。稍后在Notifier
我试图通过遍历提供map.get(threadId)
实例的地图Thread
来通知它,并且我尝试调用通知但是它正在抛出{{1} }}。我怀疑要同步IllegalmonitorException
和HashMap
类中的Thread
或Waiter
是什么..
Notifier
答案 0 :(得分:0)
您的问题的答案是:是。因为线程是一个对象,它可以存储到HashMap中。
另外,@ T.J.Crowder告诉你,你使用通知的方式是错误的。这是因为您正在调用通知没有线程锁定的对象(map.get(entry.getKey()).notify();
)。而不是你应该调用具有线程锁定的对象notify
(Runner
)的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(..){
//..
};
}
}