正在为这个问题寻找合适的同步java代码
问题 乘客们来到公共汽车站等公共汽车。当公交车到达时,所有等待的乘客都会调用boardBus,但在公交车登机时到达的任何人都必须等待下一辆公交车。公共汽车的载客量为50人;如果有 有50多人在等,有些人将不得不等下一班公共汽车。当所有等候的乘客都上车后,公共汽车就可以出发了。如果公共汽车在没有乘客的情况下到达,它应该立即出发。请注意,巴士和乘客将在一天中继续到达。假设公共汽车和乘客的到达时间呈指数分布,平均分别为20分钟和30秒 对于这个问题,我需要一个并发程序,它可以满足java中的互斥和同步,并且解释清楚。有人能帮我吗 公共汽车 骑手正在为这个问题寻找合适的同步java代码,java,multithreading,concurrency,mutex,semaphore,Java,Multithreading,Concurrency,Mutex,Semaphore,问题 乘客们来到公共汽车站等公共汽车。当公交车到达时,所有等待的乘客都会调用boardBus,但在公交车登机时到达的任何人都必须等待下一辆公交车。公共汽车的载客量为50人;如果有 有50多人在等,有些人将不得不等下一班公共汽车。当所有等候的乘客都上车后,公共汽车就可以出发了。如果公共汽车在没有乘客的情况下到达,它应该立即出发。请注意,巴士和乘客将在一天中继续到达。假设公共汽车和乘客的到达时间呈指数分布,平均分别为20分钟和30秒 对于这个问题,我需要一个并发程序,它可以满足java中的互斥和同步
import java.util.ArrayList;
导入java.util.concurrent.Semaphore;
公共类附加条款{
public void invokeBoard(){
System.out.println(“我在公共汽车上登上了……);
}
}
公共汽车站经理
import java.util.ArrayList;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.Semaphore;
公营巴士站经理{
布尔无误;
int n;
信号量计数\互斥;
信号量总线互斥;
阵列列表等待队列;
ArrayList公共汽车站排队;
公共巴士站经理(){
this.isArrived=false;
这个。n=0;
this.count_mutex=新信号量(1);
this.bus_mutex=新信号量(1);
this.waiting_stage_queue=new ArrayList();
this.bus_stand_queue=new ArrayList();
}
公共利益{
骑手=新骑手();
试一试{
count_mutex.acquire();
如果(n<50&&!已发送){
n=n+1;
公共汽车站排队。添加(骑手);
}否则{
等待队列。添加(骑手);
}
count_mutex.release();
}捕捉(中断异常e){
System.out.println(“线程被挂起”);
}
}
公共无效负载_总线(){
试一试{
bus_mutex.acquire();
总线=新总线();
isArrived=真;
如果(n!=0){
车手(车手:公共汽车站排队){
rider.invokeBoard();
}
n=0;
}
公共汽车。出发();}
捕获(中断异常ie){
System.out.println(“线程被挂起”);
}
}
public void execute(){
ExecutorService ExecutorService=Executors.newFixedThreadPool(10);
//Java8中引入的方法引用
executorService.submit(此::putRider);
executorService.submit(此::加载_总线);
//封闭式服务
executorService.shutdown();
}
}
用法
公共类主{
公共静态void main(字符串[]args){
BusStandManager BusStandManager=新的BusStandManager();
busStandManager.execute();
}
}
线程未按预期运行,输出为
这个问题是并发编程中的常见问题。格兰特·哈钦斯(Grant Hutchins)为这个问题提供了一个极好的解决方案。 他使用了3个信号灯和一个计数器来获得解决方案
waiting = 0;
mutex = new Semaphore(1)
bus = new Semaphore(0)
boarded = new Semaphore(0)
等待-登机区的乘客人数
互斥-用于保护等待变量
巴士-它是用来告诉车手,巴士在法院或没有
已上车-用于告诉公共汽车乘客已上车
总线过程代码
这里,互斥锁用于锁定waiting变量,因为每当总线到达时,没有人可以增加waiting。
n是等待的最小值和50,因为如果我们有70名乘客,我们只能有50名乘客上车,如果我们有30名乘客,我们可以带所有乘客上车。在这个最低条件下,我们只需要50名乘客。
然后,对于每个乘客,公交车发出信号,告知其已到达,以便乘客可以上车
在50名乘客上车后,如果我们在初始阶段的乘客少于50名,则等待时间将设置为零,否则,由于50名乘客上车,我们将减少50名乘客
然后我们释放互斥锁,这样新的骑手就可以来增加值
附加代码
rider线程等待互斥锁,当它获得锁时,它将增加等待以告知它正在等待总线
骑手线程正在等待总线,因此当总线到达时,总线骑手线程可以转到board方法。然后骑手执行board()方法,它将发出骑手已登机的信号。因此,总线将再次向另一个线程发送信号
我们还有另一个解决方案,它在本文中描述。
Java实现可以在下面的示例中找到
`好吧,你试过什么了?不,我们不会帮你做作业的。向我们展示您的尝试,并解释您的困境,我们可以帮助您解决问题Hi@Anix请查看我的更新查看我的答案
waiting = 0;
mutex = new Semaphore(1)
bus = new Semaphore(0)
boarded = new Semaphore(0)
mutex . wait ()
n = min ( waiting , 50)
for i in range ( n ):
bus . signal ()
boarded . wait ()
waiting = max ( waiting -50 , 0)
mutex . signal ()
depart ()
mutex . wait ()
waiting += 1
mutex . signal ()
bus . wait ()
board ()
boarded . signal ()