1

这是家庭作业,但我只是在寻找正确方向的推动(而不是有人为我做我的工作)。

  • 我有四个线程
  • 他们每个人都在一个循环中打印出自己的数字:分别是 1、2、4 和 8
  • 在我的 main 开始时,我必须启动所有四个线程,然后在 500 毫秒后结束它们
  • 我将使用信号量以确保仅以这种重复模式打印这些数字:1111111122224481111111122222448111111112222448……</li>
  • 我不会使用 while、for、if、else 等。
  • 我正在使用 Java

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

善良的灵魂能给我一些方向吗?即使您只是将我指向精彩的视频或文章,我也会感激不尽。

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

4

2 回答 2

1

如果您使用 Java 的信号量,我假设对 acquire() 的调用被阻塞。所以考虑到这一点,如果一个线程试图获取一个已经被另一个线程获取的信号量,它必须等到它可以自由获取

于 2013-10-29T19:48:37.573 回答
1

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

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

由于我不想做你的作业,我将举一个只有 2 个线程的示例:

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 .

于 2013-10-29T19:50:27.633 回答