停车场用Java信号灯
我想做一个停车场计划。我有多个线程将汽车对象放入队列,然后放入共享缓冲区。一旦sharedBuffer达到最多50个元素 问题是:一旦共享缓冲区达到元素的最大数量。我希望线程开始将元素排队到队列中。相反,线程等待信号量打开一个点停车场用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
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,这是一个类似的问题。