Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在为这个问题寻找合适的同步java代码_Java_Multithreading_Concurrency_Mutex_Semaphore - Fatal编程技术网

正在为这个问题寻找合适的同步java代码

正在为这个问题寻找合适的同步java代码,java,multithreading,concurrency,mutex,semaphore,Java,Multithreading,Concurrency,Mutex,Semaphore,问题 乘客们来到公共汽车站等公共汽车。当公交车到达时,所有等待的乘客都会调用boardBus,但在公交车登机时到达的任何人都必须等待下一辆公交车。公共汽车的载客量为50人;如果有 有50多人在等,有些人将不得不等下一班公共汽车。当所有等候的乘客都上车后,公共汽车就可以出发了。如果公共汽车在没有乘客的情况下到达,它应该立即出发。请注意,巴士和乘客将在一天中继续到达。假设公共汽车和乘客的到达时间呈指数分布,平均分别为20分钟和30秒 对于这个问题,我需要一个并发程序,它可以满足java中的互斥和同步

问题

乘客们来到公共汽车站等公共汽车。当公交车到达时,所有等待的乘客都会调用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 ()