如何在不使用if-else,while,for等的情况下使用信号量

时间:2013-10-29 19:31:41

标签: java multithreading semaphore

这是家庭作业,但我只是想朝着正确的方向努力(不是有人为我工作)。

  • 我有四个帖子
  • 他们各自在一个循环中打印出自己的数字:分别为1,2,4和8
  • 在我的主要开始时,我必须启动所有四个线程,然后在500ms之后结束它们
  • 我将使用信号量以确保只有这些数字以这种重复模式打印:111111112222448111111112222448111111112222448 ......
  • 我不会使用while,for,if,else等等。
  • 我正在使用Java

我不知道如何在不使用if语句的情况下明确地将该模式打印出来,而且我对信号量非常不熟悉,而且对线程只有一点熟悉。

善良的灵魂能给我一些方向吗?即使你只是给我一个精彩的视频或文章,我也会很感激。

编辑:对不起。我让事情搞得一团糟。在每个线程中已经为我定义了while语句。每个while语句一次只打印其中一个数字。例如:它打印“1”而不是“11111”。这是我不允许定义任何 more while语句等。

2 个答案:

答案 0 :(得分:1)

如果你正在使用Java的信号量,我假设然后调用acquire()是阻塞的。因此,考虑到这一点,如果某个线程试图 获取 已经被另一个线程获取的信号量,则必须 等待 ,直到 获取

为止

答案 1 :(得分:1)

每个模式都需要一个信号量。第一个应该初始化为1(因为你希望该线程运行),所有其他的应该被初始化为0(因为你想首先阻塞这些线程)。

每个线程都应该从减少其信号量的值开始(如果信号量的值为0,则该调用将被阻塞)。在线程1的末尾,您应该增加第二个信号量的值。在线程2的末尾,您应该增加第3个信号量的值,依此类推。在最后一个线程结束时,你应该再次增加第一个信号量的值,重新开始。

由于我不想做你的作业,我只举两个帖子的例子:

public static void main(String[] args) {
    final Semaphore thread1Block = new Semaphore(1);
    final Semaphore thread2Block = new Semaphore(0);

    Thread thread1 = new Thread(new Runnable() {
        public void run() {
            while (true) {
                // reduce the value of the first semaphore by one
                // blocking if the value is 0
                thread1Block.aquire();

                System.out.print("11111111");

                // increase the value of the second semaphore by one
                thread2Block.release();
            }
        }
    });

    Thread thread2 = new Thread(new Runnable() {
        public void run() {
            while (true) {
                // reduce the value of the second semaphore by one
                // blocking if the value is 0
                thread2Block.aquire();

                System.out.print("2222");

                // increase the value of the first semaphore by one
                thread1Block.release();
            }
        }
    });

    // start the threads
    thread1.start();
    thread2.start();
}

修改

我显然误解了这个问题。棘手的部分是使用信号量,使它们充当计数器。我会以下面的方式做到(再次,只有2个线程作为例子):

public static void main(String[] args) {
    final Semaphore s1 = new Semaphore(8);
    final Semaphore s2 = new Semaphore(0);

    Thread t1 = new Thread(new Runnable() {
        public void run() {
            while (true) {
                s1.acquire();
                System.out.print("1");
                s2.release(4 * ((8 - s1.availablePermits()) / 8));
            }
        }
    });

    Thread t2 = new Thread(new Runnable() {
        public void run() {
            while (true) {
                s2.acquire();                   
                System.out.print("2");
                s1.release(8 * ((4 - s2.availablePermits()) / 4));
            }
        }
    });

    t1.start();
    t2.start();
}

技巧是每个信号量也用作计数器:只有当第一个信号量的值为0时,第二个信号量的值才会增加4.同样,当第二个信号量的值为0时,第一个信号量的值为增加8。