这是家庭作业,但我只是想朝着正确的方向努力(不是有人为我工作)。
我不知道如何在不使用if语句的情况下明确地将该模式打印出来,而且我对信号量非常不熟悉,而且对线程只有一点熟悉。
善良的灵魂能给我一些方向吗?即使你只是给我一个精彩的视频或文章,我也会很感激。编辑:对不起。我让事情搞得一团糟。在每个线程中已经为我定义了while语句。每个while语句一次只打印其中一个数字。例如:它打印“1”而不是“11111”。这是我不允许定义任何 more while语句等。
答案 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。