1

我试图在队列上有一些线程,以便我可以从那里管理它们。这可能吗?我有一些代码,但它不能正常工作。

主要思想是生成 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() 之后调用)。

4

2 回答 2

0

您可能想在 java 中检查 BlockingQueue(concrete class LinkedBlockingQueue)。此队列允许您将任何对象放入其中,即使是 Thread。如果队列已满, queue.put() 将等待。如果队列为空,则 queue.get() 将等待。wait() 和 notify() 被隐式处理。然后一组线程可以从队列中取出并按顺序执行它们。我们谈论的是生产者-消费者问题。

于 2013-05-15T04:34:07.850 回答
0

你的代码违反了一个基本的编程规则:让对象管理自己。首先,等待/通知的代码应该在该对象的方法中。然后,如果您希望线程以某种方式运行,请相应地对其运行方法进行编程。在代码中,您尝试像操作普通对象一样操作线程,而实际上它们不是。将线程视为对象的低级代码已经在等待/通知/同步以及任何同步原语中实现,除非您制作新的操作系统,否则您无需重新实现轮子。

看起来您正在尝试实现信号量。在这种情况下,您的方法不需要参数。semWait应该将当前线程放入队列中,并semSignal从队列中释放一个线程,而不是作为参数传递的线程。

一种可能的实现如下:

class Sem {
  int count;

  public synchronized void semWait() throws InterruptedException {
    while (count <= 0) {
      wait();
    }
    count--;
  }

  public synchronized void semSignal() {
    count++;
    notify();
  }
}
于 2013-05-15T10:40:02.637 回答