首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java线程和同步

Java线程和同步
EN

Stack Overflow用户
提问于 2013-11-20 07:46:41
回答 2查看 434关注 0票数 0

我正在做一个实验作业,我有点卡在如何实现一个特定的类上。我的任务是创建一个模拟“巨魔”过桥的程序。巨魔用线来表示。这是我编写的Troll类的一部分:

代码语言:javascript
复制
public class Troll implements Runnable {
// instance variables

// constructor

    public void run() {
        System.out.println( name + " has arrived at the bridge.");
        System.out.println( name + " is starting to cross.");

        // simulate crossing time
        for( int i = 1; i <= crossingTime; ++i ) {
            try{
                Thread.sleep( 1000 ); 
            }
            catch( InterruptedException e ) {}
            System.out.println( "\t" + name + " " + i + " seconds." );
        }
        System.out.println( name + " leaves at " + destination + "." );
    }
}

现在我被卡住的部分是我的“桥”类。Bridge类被认为是为了确保一次只有一个Troll通过桥。桥接类必须只有这两个具有相同方法签名的方法:

代码语言:javascript
复制
//request permission to enter bridge
public void enterBridge() {}
//notify bridge that Troll is leaving
public void leaveBridge() {}

我遇到的问题是弄清楚如何利用这些方法。我从说明中得到的提示是使用synchronize。我相信这意味着在enterBridge中使用同步块,但我看不出这是如何工作的。模拟实际穿越的代码在Troll的run方法中(这是实验所必需的)。因此,要开始交叉,您必须退出synchronized块。这将释放“锁定”,然后其他巨魔将在前一个巨魔完成之前开始穿越,这不是我们想要的。

首先,我并不认为需要Bridge方法,因为我可以将我的Troll的run方法中的代码放在一个synchronized块中:

代码语言:javascript
复制
public void run() {
    System.out.println( name + " has arrived at the bridge.");
    synchronized( bridge ) {
        //Code from before
   }
}

这确保了一次只有一个巨魔在穿越,而不需要调用Bridge类方法。那么谁能告诉我实验室对Bridge课程有什么用处?我觉得我忽略了一些显而易见的东西,或者我误解了synchronize的工作原理。

EN

回答 2

Stack Overflow用户

发布于 2013-11-20 08:01:55

您可以使用信号量轻松地解决问题。信号量可以在java.util.concurrent中找到。在一次只有一个巨魔通过桥的情况下,信号量是一个稍微过度的解决方案,但当几个巨魔能够同时通过桥时,信号量将变得很方便。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

票数 0
EN

Stack Overflow用户

发布于 2013-11-20 08:21:42

阅读Guarded Blocks上的文档

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20084633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档