Java和模拟进程计划

时间:2015-12-11 17:44:37

标签: java

我非常感谢所提供的所有帮助,但我现在正在努力完成任务的最后一部分,即使增量和减量在交替中发生。我编辑过包括整个主类和类增量器,它包含一个调用 Main.increment 给定次数的for循环(有一个类减量器,其样式与icrementer相同)所以我没有包括它)。你能帮我解决这个问题吗?如果我理解正确,我希望 sharedValue 的值在1和0之间切换。

public class Main extends Thread {

private static int sharedValue = 0;
private static Semaphore semaphore = new Semaphore(1);

public static void increment() {
    semaphore.down();
    sharedValue++;
    semaphore.up();
}

public static void decrement() {
    semaphore.down();
    sharedValue--;
    semaphore.up();
}

static int numberOfCycles = 20000;

public static void main(String[] args) throws InterruptedException {

    incrementer inc = new incrementer(numberOfCycles);
    inc.start();
    inc.join();

    decrementer dec = new decrementer(numberOfCycles);
    dec.start();
    dec.join();

    System.out.println(sharedValue);

}}

信号量类

private int count;
// Constructor
public Semaphore(int n) {
    count = n;
}

// Only the standard up and down operators are allowed.
public synchronized void down() {

    while (count == 0) {

        try {
            wait(); // Blocking call.
        } catch (InterruptedException exception) {
        }
    }
    count--;
}

public synchronized void up() {
    count++;
    notify();
  }
}

增量等级

公共类增量器扩展了线程{

private int numberOfIncrements;

public incrementer(int numOfIncrements){
     numberOfIncrements = numOfIncrements;
} 
public void run(){
    for(int i = 0; i <= numberOfIncrements; i++){
    Main.increment();
}
}

}

再次感谢。

2 个答案:

答案 0 :(得分:3)

我认为他的意思是受到信号量的保护。所以,你会使用类似的东西:

class ProtectedCount {
    private static int sharedValue = 0;
    private static Semaphore semaphore = new Semaphore(1);
    public void increment() {
        semaphore.down(); // wait till the semaphore is available
        sharedValue++;
        semaphore.up(); // tell everyone that the semaphore is available
    }
    // same thing for decrement()
}

这表明使用信号量来提供互斥。此用例类似于互斥锁。请参阅semaphore vs. mutex on Wikipedia

答案 1 :(得分:0)

在Semaphore课程中,您可能需要确保&#34; up&#34;方法不会超过&#34; n&#34;在构造函数中传递。

// Constructor
public Semaphore(int n) {
    count = n;
}

public synchronized void up() {
    count++; //Ensure count doesn't exceed n.
    notify();
  }