忙着等待使用信号量

时间:2017-12-09 21:16:08

标签: java multithreading synchronization semaphore

我正在使用信号量做一些同步线程。现在我要做的是等待一些客户线程使用floor_clerk线程中的信号量到达队列。我之前使用while循环做它。客户线程也必须等待,直到map_clerk也使用信号量帮助它。我之前使用深度睡眠做这件事。 必须使用P(信号量)(获取)实现任何等待这是等待应该完成的方式。 这是任务: 地板职员等待(使用信号量)客户到达;然后,他们帮助他们获得他们需要的任何信息。但是,地板职员一次只能帮助一个客户;因此,客户必须等待(使用信号量)为可用的职员提供帮助。

我之前的Floor_clerk等待代码是:

while (done != Main.csize) {        
    //wait while their is no customer in queue
    while (queue.isEmpty() && done != Main.csize) {
    }

    //while their is a customer in queue assist customers
    while (queue.size() != 0 && done != Main.csize) {
        //some stuff to do
    }
}

请帮我在这里实现信号量。

1 个答案:

答案 0 :(得分:0)

只需将您的客户端存储在阻塞队列中,然后使用take()方法阻止,直到有可用的客户端为止。没有必要将队列和阻塞机制分开,因为它已经内置到库中。

如果你必须使用信号量,信号量通过基本上具有“许可”的阻塞队列来工作。您应该考虑这种阻止功能如何适合您要执行的操作。当有可用的客户端时,您希望release()许可并允许服务acquire()。如果没有任何许可,则该服务将在acquire()上阻止。

// Add client
queue.add(client);
semaphore.release();

// Clerk loop
while (true) { // Whatever condition
    semaphore.acquire(); 
    Client client = queue.remove();
    // ...
}