我正在尝试在队列上有一些线程,所以我可以从那里管理它们。这可能吗?我有一些代码,但它无法正常工作。
主要思想是生成X线程并将每个线程放在另一个类的队列中。然后在具有队列的类中使用wait()和notify()方法来获得FIFO执行顺序。
提前致谢。
部分代码:
public synchronized void semWait(Thread petitionerThread){
count--;
if(count < 0){
try {
petitionerThread.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
FIFOQueue.add(petitionerThread);
}
}
public synchronized void semSignal(Thread noticeThread){
count++;
if(count <= 0)
if(!FIFOQueue.isEmpty())
FIFOQueue.pollLast().notify();
}
编辑:问题是当一个线程进入队列并且它等待时,会发生一些事情,即semSignal方法永远不会被执行任何其他线程(在semWait()之后调用)。
答案 0 :(得分:0)
您可能想要在java中检查BlockingQueue(具体类LinkedBlockingQueue)。此队列允许您将任何对象放入其中,即使是Thread也是如此。如果队列已满,queue.put()将等待。如果队列为空,queue.get()将等待。 wait()和notify()被隐式处理。 然后,一组线程可以从队列中获取并按顺序执行它们。 我们谈论的是生产者 - 消费者问题。
答案 1 :(得分:0)
您的代码违反了一条基本的编程规则:让对象自行管理。首先,等待/通知的代码应该在该对象的方法内。然后,如果您希望某个线程以某种方式运行,请相应地编写其run方法。在代码中,您尝试操纵线程就像它们是普通对象一样,而它们不是。将线程视为对象的低级代码已经在wait / notify / synchronized和任何同步原语中实现,除非你创建一个新的操作系统,否则你不需要重新实现轮子。
看起来你正在尝试实现信号量。在这种情况下,您的方法不需要参数。 semWait
应放在队列当前线程中,semSignal
从队列中释放一个线程,而不是作为参数传递的线程。
一种可能的实施方式如下:
class Sem {
int count;
public synchronized void semWait() throws InterruptedException {
while (count <= 0) {
wait();
}
count--;
}
public synchronized void semSignal() {
count++;
notify();
}
}