使用信号量和共享变量进行Java编程

时间:2011-04-20 18:07:45

标签: java semaphore parallel-processing

嘿大家,我有一个在学校表演的任务,真的不知道怎么开始。 我不想要整个解决方案,而是提示以及如何开始使用它。对不起,我是编程新手。这是任务:

公告牌(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个线程同时运行,一次只能说一个许可: static Semaphore tabsA = new Semaphore(3);

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

3 个答案:

答案 0 :(得分:1)

作为一项规则,我不喜欢直接回答作业问题,但您可能希望将研究重点放在Random课程及其nextInt(int)方法,List<T>界面和它的实现,Runnable接口(和Thread类)以及Semaphore类及其tryAcquire()release()方法。)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

一种方法可能是将每个租借通知表示为可用标签数量Semaphore

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