2011-04-20 83 views
0

嘿大家,我有一个任务在学校表演,真的不知道如何开始。 我不想要整个解决方案,而是提示以及如何开始使用。对不起,但我是编程新手。这里的任务:使用信号量和共享变量进行Java编程

公告板(40p)用于张贴公寓租金公告。每份租赁通知都包含3个带有电话号码的可撕式标签。一群n学生扫描寻找公寓的董事会。每个学生随机选择3个不同的公寓,并尝试从3个相应的通知中删除一个标签。如果学生成功选择了他/她选择的3个选项卡,他/她将离开,否则他/她不会占用任何时间,随机停留一段时间,然后再次尝试选择3个不同的公寓。当所有学生都离开时,模拟结束。假设董事会有空间进行综合报告(n/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();} 
    } 
} 

我有一个问题,我不明白。 我有4个线程在同一时间运行,一次说一个许可证: 静态信号标签A =新的信号量(3);

所以我的线程将永远运行的原因,它没有得到任何。但如果我使用tabsA.release();当线程不符合要求时,即使在Semaphore(3)中有3个许可证时,所有四个线程都可以获得许可证。我甚至可以跑10次,它会起作用。怎么来的?

+0

你需要使用这个:http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html,据推测 – 2011-04-20 18:11:00

+0

因此,考虑到课程讲座和书籍/参考信息,**解释如何接近解决方案的一些想法/想法/算法。在这个大纲中不需要任何Java特定的东西 - 只需使用类(和“仅使用信号量”)中讲授的并行/并发概念。 – 2011-04-20 18:12:27

回答

0

我会建议连续编写这个(即一次一个学生),以使您的基本对象/方法/算法正常工作。这对你来说应该相对简单。然后在开始重构并行性并回答相关问题时再回来。

+0

那么一个许可证对应一个通知? – Christian 2011-04-22 12:07:13

0

一种方法可能是将每个租借通知表示为具有Semaphore可用选项卡的数量。

信号量基本上是一种声明存在有限数量资源的方式。当一个进程试图获得一个信号量时,它基本上要求一个许可证来使用Semaphore象征性地守护的资源。当获得许可证的流程与资源一起完成时,它应该释放许可证,以便另一个流程可以获得该许可证。如果一个进程想要等待(可能永远)许可证在Java中可用,它会调用Semaphore.acquire()。如果一个进程试图获得一个许可证,如果它立即可用或者做别的事情,那么在Java中调用Semaphore.tryAcquire()

1

作为一个规则,我不喜欢直接回答功课的问题,但你可能要集中你的研究Random类及其nextInt(int)法,List<T>接口和它的实现中,Runnable接口(和Thread类) ,Semaphore类及其tryAcquire()release()方法)。

+0

只要确保你不要调用信号量的'release()'方法,除非你真的设法首先从它获得许可证......(我以前从来没有犯过这样的错误或任何事情!*无辜的口哨*) – Powerlord 2011-04-20 18:25:04

+0

终于{释放许可}在这里使用{获取许可} :) – 2011-04-20 18:27:06

+0

@ChrisDennett:呃,根据这个应用程序的规格,你只想发布许可证,如果你不能收集所有三个随机选择的。 – Powerlord 2011-04-20 19:09:05