使用信号量和共享变量的Java编程
大家好,我在学校有一项任务要完成,真的不知道如何开始。 我不想要整个解决方案,而是想要一些技巧和如何开始使用它。对不起,我是编程新手。任务如下: 公告栏(40p)用于张贴公寓租赁通知。每个租赁通知包括3个撕下的标签,上面有电话号码。一群n名学生扫描黑板寻找公寓。每个学生随机选择3个不同的公寓,并尝试从3个相应的通知中删除一个选项卡。如果学生成功地选择了3个标签,他/她会离开,否则他/她不会选择任何标签,会随机暂停一段时间,然后重新选择3个不同的单元。当所有学生都离开时,模拟结束。假设董事会有空间放置汇总(n/3)通知。开发一个模拟学生动作的并行程序,只使用信号量进行同步。将学生表示为并发进程。确保声明并初始化用于流程交互和同步的共享变量。尝试最大化并发性。简要说明您的解决方案是如何工作的,以及它是如何避免死锁的使用信号量和共享变量的Java编程,java,semaphore,parallel-processing,Java,Semaphore,Parallel Processing,大家好,我在学校有一项任务要完成,真的不知道如何开始。 我不想要整个解决方案,而是想要一些技巧和如何开始使用它。对不起,我是编程新手。任务如下: 公告栏(40p)用于张贴公寓租赁通知。每个租赁通知包括3个撕下的标签,上面有电话号码。一群n名学生扫描黑板寻找公寓。每个学生随机选择3个不同的公寓,并尝试从3个相应的通知中删除一个选项卡。如果学生成功地选择了3个标签,他/她会离开,否则他/她不会选择任何标签,会随机暂停一段时间,然后重新选择3个不同的单元。当所有学生都离开时,模拟结束。假设董事会有空间
更新以包含作为答案提供的信息 这是到目前为止我的代码!我的方向对吗
private static Semaphore[] apartments;
public void setApartments()
{
apartments = new Semaphore[3];
for(int i = 0; i < 3; i++)
apartments[i] = new Semaphore(3);
}
@Override
public void run()
{
setApartments();
Random random = new Random();
while(counter < 3)
{
try
{
acquired = apartments[random.nextInt(3)].tryAcquire();
if(acquired)
System.out.println("Student" + id + " succeded.");
else
System.out.println("Student" + id + " failed.");
counter++;
}
catch(Exception e) {e.printStackTrace();}
}
}
私有静态信号[]公寓;
公共公寓()
{
公寓=新信号灯[3];
对于(int i=0;i<3;i++)
公寓[i]=新信号灯(3);
}
@凌驾
公开募捐
{
SET公寓();
随机=新随机();
while(计数器<3)
{
尝试
{
收购=公寓[random.nextInt(3)].tryAcquire();
如果(收购)
System.out.println(“学生”+id+“成功”);
其他的
System.out.println(“学生”+id+“失败”);
计数器++;
}
catch(异常e){e.printStackTrace();}
}
}
我有一个问题我想不出来。
我有4个线程同时运行,每次讨论一个许可证:
静态信号量tabsA=新信号量(3)
所以我的线程将永远运行,因为它没有得到任何。但是如果我使用tabsA.release();当线程不满足要求时,即使信号量(3)中有3个许可证,所有四个线程都可以获得许可证。我甚至可以跑10次,这也行。为什么会这样?我建议连续写这篇文章(即一次写一个学生),只是为了让你的基本对象/方法/算法正常工作。这对你来说应该是相对简单的。然后,当您开始重构并行性时,再回来询问相关问题。一种方法可能是将每个租赁通知表示为对可用选项卡的数量进行了调整
信号量基本上是一种声明有限数量资源存在的方式。当一个进程试图获取一个信号量时,它基本上是在请求使用该信号量象征性地保护的资源的许可证。当获得许可证的流程使用资源完成时,应释放许可证,以便其他流程可以获得许可证。如果进程希望等待(可能永远)Java中的许可证可用,它将调用
Semaphore.acquire()
。如果一个进程只是想在立即可用的情况下尝试获得许可证,或者做其他事情,那么在Java中,它通常调用信号量.tryAcquire()
,我不喜欢直接回答家庭作业问题,但您可能希望将研究重点放在类及其方法、接口和实现上,接口(和类),以及类及其方法)。您需要使用以下内容:,假设根据课程讲课和书籍/参考信息,解释一些关于如何处理解决方案的想法/想法/算法。本大纲中不需要任何特定于Java的内容——只需使用课堂上讲授的并行/并发概念(以及“仅使用信号量”)。只需确保不要调用信号量的release()
方法,除非您确实先从它那里获得了许可证。。。(我从来没有犯过这样的错误或其他任何错误!无辜地吹口哨)使用try{get permit}最终{release permit}这里:)@ChrisDennett:Er,根据这个应用程序的规范,如果你不能收集所有三个随机选择的许可证,你只想发布许可证。那么一个许可证对应一个通知?