用于线程化的信号量背后的逻辑

时间:2014-10-20 13:15:55

标签: java multithreading concurrency semaphore

我期待5个结果,即1个,2个,3个,4个,5个但是我会得到更多?有人可以帮我理解信号量吗?当然每个线程使用" start"调用run方法时,它应该加1 到int aNumber然后打印aNumber

我不明白为什么我会得到超过五个结果。

// mainClass creates Semaphore, so Copier class no longer needed
import java.util.concurrent.Semaphore;
public class mainClass {

    public static void main(String[] args) throws InterruptedException {
        Semaphore cp1 = new Semaphore(1, true);
        Worker[] workers = new Worker[5];
        for (int x=0;x<5;x++) {
            workers[x] = new Worker("w" + x, cp1);
        }
        for (int x=0;x<5;x++) {
            workers[x].start();
        }
        for (int x=0;x<5;x++) {
            workers[x].join();
        }
    }
}
import java.util.concurrent.Semaphore;
public class Worker extends Thread{
    int aNumber = 0;
    String myName;
    Semaphore myCopier;
    public Worker(String nameIn, Semaphore copierIn) {
        myName = nameIn;
        myCopier = copierIn;
    }
    public void run() {
        for (int x=0;x<5;x++) {
            try {
                sleep((int) (Math.random() * 5000));  // do some filing
                myCopier.acquire();
                aNumber +=1;
                //System.out.println(myName + " doing some copying");
                System.out.println(aNumber);
                sleep((int) (Math.random() * 1000));  // do some copying
                myCopier.release();
            } catch (InterruptedException e) { }       
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我无法明确表达你的意图。您是否尝试使用信号量按每个线程顺序打印nos(1到5)?在这种情况下,您可以尝试以下方法:

//mainClass creates Semaphore, so Copier class no longer needed
import java.util.concurrent.Semaphore;
public class mainClass {

 public static void main(String[] args) throws InterruptedException {
     Semaphore cp1 = new Semaphore(1, true);
     Worker[] workers = new Worker[5];
     for (int x=0;x<5;x++) {
         workers[x] = new Worker("w" + x, cp1, x+1);
     }
     for (int x=0;x<5;x++) {
         workers[x].start();
     }
     for (int x=0;x<5;x++) {
         workers[x].join();
     }
 }
}


class Worker extends Thread{
    int aNumber = 0;
    String myName;
    Semaphore myCopier;
    public Worker(String nameIn, Semaphore copierIn, int no) {
        myName = nameIn;
        myCopier = copierIn;
        aNumber = no;
    }
    public void run() {
        /*for (int x=0;x<5;x++) {*/
            try {
                //sleep((int) (Math.random() * 5000));  // do some filing
                myCopier.acquire();
                //System.out.println(myName + " doing some copying");
                System.out.println("Name of the thread:" + myName + " Printed No is:" + aNumber);
                //sleep((int) (Math.random() * 1000));  // do some copying
                myCopier.release();
            } catch (InterruptedException e) { }       
        //}
    }
}