Java线程和同步

时间:2013-11-19 23:46:41

标签: java

我正在进行实验室任务,而且我对如何实现特定课程感到困惑。我的任务是创建一个程序来模拟跨过桥梁的“巨魔”。巨魔由线程代表。这是我写过的Troll课程的一部分:

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类假设确保一次只有1个Troll穿过网桥。桥类必须只有这两个方法具有相同的方法签名:

//request permission to enter bridge
public void enterBridge() {}
//notify bridge that Troll is leaving
public void leaveBridge() {}

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

我首先没有真正看到Bridge方法的需要,因为我可以将代码放在我的Troll运行方法的同步块中:

public void run() {
    System.out.println( name + " has arrived at the bridge.");
    synchronized( bridge ) {
        //Code from before
   }
}

这确保一次只有一个Trolls可以跨越,而无需调用Bridge类方法。那么有人可以告诉我实验室在Bridge类中得到了什么吗?我觉得我忽视了一些显而易见的事情,或者我误解了同步是如何运作的。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

阅读Guarded Blocks

上的文档