2013-05-15 60 views
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()之后调用它)。

+2

没有什么根本上的错误使用这种方法。如果它不起作用,那么代码中可能存在一个错误。你能不能在这里发布代码,以便我们可以查看它并提供有用的反馈? – templatetypedef

+1

你为什么不使用java的executor框架:http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html http://docs.oracle.com/javase /tutorial/essential/concurrency/exinter.html –

+0

@templatetypedef我编辑并添加了一些代码。我不知道我是否正确地做... – Harold

回答

0

您可能想要在java中检查BlockingQueue(具体类LinkedBlockingQueue)。这个队列允许你放入任何对象,甚至是线程。如果队列已满,queue.put()将等待。如果队列为空,queue.get()将等待。 wait()和notify()被隐式照顾。 然后一组线程可以从队列中取出并按顺序执行它们。 我们正在谈论生产者 - 消费者问题。

+0

是的,我听说过这门课。现在我试图弄清楚我做错了什么,但是用我的队列。但是,谢谢,我会考虑用这个来解决我的问题。 其实我有一些限制,这是因为是一个课程项目。 – Harold

0

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

看起来像你正在试图实施信号量。在这种情况下,你的方法不需要参数。 semWait应该放入队列中的当前线程,并且semSignal释放队列中的线程而不是作为参数传递的线程。

一种可能的实现方式如下:

class Sem { 
    int count; 

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

    public synchronized void semSignal() { 
    count++; 
    notify(); 
    } 
}