停车场用Java信号灯

停车场用Java信号灯,java,multithreading,synchronization,thread-safety,semaphore,Java,Multithreading,Synchronization,Thread Safety,Semaphore,我想做一个停车场计划。我有多个线程将汽车对象放入队列,然后放入共享缓冲区。一旦sharedBuffer达到最多50个元素 问题是:一旦共享缓冲区达到元素的最大数量。我希望线程开始将元素排队到队列中。相反,线程等待信号量打开一个点 public class Buffer { private LinkedList queue = new LinkedList(); private Semaphore spots = new Semaphore(50); public sy

我想做一个停车场计划。我有多个线程将汽车对象放入队列,然后放入共享缓冲区。一旦sharedBuffer达到最多50个元素

问题是:一旦共享缓冲区达到元素的最大数量。我希望线程开始将元素排队到队列中。相反,线程等待信号量打开一个点

public class Buffer {

    private LinkedList queue = new LinkedList();
    private Semaphore spots = new Semaphore(50);

    public synchronized void put(String car) {
        try {
            spots.acquire();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        queue.addLast(car);
        notifyAll();
    }

    public synchronized String get() throws InterruptedException {
        String t = (String) queue.removeFirst();
        spots.release();
        notifyAll();
        return t;
    }

    public int getSize() {
        return queue.size();
    }
}
方法,该方法要么将汽车添加到缓冲区,要么在缓冲区已满时直接将汽车添加到队列

public void addToQueue(int queue) {
        if (queue == 1 && northQueue<20) {
               if(buffer.getSize()==50){
                  northQueue++;
               }else{
                  buffer.put("Volvo");
               }
        }
} 


public void run() {
    while (true) {
        // System.out.println("Thread: " + threadNumber);
        eq.addToQueue(threadNumber);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {

        }
    }
}
public void addToQueue(int-queue){

如果(queue==1&&northqueue)您确定,信号量是解决您的问题的正确概念吗?它被设计为阻止线程,直到有一个空闲的“点”。你想用你的代码做什么?我不知道我是否能正确解释,但我会尝试。基本上,我正在尝试制作一个停车场程序。我使用一个线程池,有3个线程同时运行。这是停车场的4个入口,北、东、南和西。如果停车场有一个位置,我会在每个入口添加车辆入口中不应该有队列。但是如果共享缓冲区(批次)已满,则每个入口都应该有队列堆积。您可以显示线程中运行的代码吗?嗯,刚刚测试了您的代码,它对我来说没有阻塞,当缓冲区已满时,它将对元素进行排队,直到队列已满(20是您的限制):我使用synchronized block的意思是:为什么要调用
notifyAll()
?我看不到相应的
wait()
。此外,
addToQueue(int)
是不同步的,因此,如果
语句不是原子的,则连续的
语句就不能在这样的并发环境中依赖它们的结果。看看Hilzer's barbershop,这也是一个类似的问题。你确定信号量是解决问题的正确概念吗?它被设计为阻止线程,直到出现空闲线程为止“点"。你想用你的代码做什么?我不知道我是否能正确解释,但我会尝试。基本上,我正在尝试制作一个停车场程序。我使用一个线程池,有3个线程同时运行。这是停车场的4个入口,北、东、南和西。如果停车场有一个位置,我会在每个入口添加车辆入口中不应该有队列。但是如果共享缓冲区(批次)已满,则每个入口都应该有队列堆积。您可以显示线程中运行的代码吗?嗯,刚刚测试了您的代码,它对我来说没有阻塞,当缓冲区已满时,它将对元素进行排队,直到队列已满(20是您的限制):我使用synchronized block的意思是:为什么要调用
notifyAll()
?我看不到相应的
wait()
。此外,
addToQueue(int)
是不同步的,因此,连续的
if
语句不是原子的,因此在这种并发环境中,您不能依赖它们的结果。看看Hilzer's barbershop,这是一个类似的问题。