Thread对象的队列

时间:2013-05-15 03:42:08

标签: java multithreading list linked-list queue

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

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

2 个答案:

答案 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();
  }
}
相关问题