【发布时间】:2020-05-01 04:28:48
【问题描述】:
我可以创建一个静态函数来通知在此类的任何实例中等待的所有线程吗?
(这里的逻辑是我有队列中有线程在等待,因为它们是空的,我想在调用这个函数时完成程序的运行)
queue = new Vector<T>();
public synchronized T extract(){
while(queue.isEmpty())
try {
this.wait();
if(!active) {return null;}
}catch(InterruptedException e) {}
T t = queue.elementAt(0);
queue.remove(0);
return t;
}
这是提取方法。 当队列为空时,线程进入等待状态。 我想让布尔值“激活”为 false 并 notifyAll。
那我会确保线程不会再调用这个方法
【问题讨论】:
-
你能添加你的代码sn-p吗?你面临什么问题?
-
我添加了部分代码和一些额外的解释。
-
不,除非你列出所有类的实例。
-
(不相关,但我已经看到您的代码存在问题(除了最少使用大括号):如果在进入
synchronized块之前它不是 active ,您可以提交wait。此外,通常评论(可变)全局状态是一个坏主意。) -
忽略中断的线程是无法终止的流氓线程。不要忽略 InterruptedExceptions。您可以做的最好的事情是使用
throws InterruptedException声明您的方法并完全删除try/catch;或者将整个方法体放在try块中,这样中断就会干净地终止它。永远不要写一个空的 catch 块;至少,在其中调用e.printStackTrace();。毕竟,您想知道您的方法行为异常的原因。
标签: java multithreading static queue wait