Multithreading 信号量未按预期工作,正在被锁定
我使用信号量进行线程通信我有两个线程一个是OddThread,另一个是EvenThread,我打印的值是1到10,OddThread只打印1到10之间的奇数,EvenThread只打印1到10之间的偶数。为此,我使用了线程的信号量来正确地进行通信。实际发生的情况是,OddThread只打印1,EvenThread只打印2,然后两者都被停止。我不了解实际发生的事情。任何人都能提出建议Multithreading 信号量未按预期工作,正在被锁定,multithreading,semaphore,Multithreading,Semaphore,我使用信号量进行线程通信我有两个线程一个是OddThread,另一个是EvenThread,我打印的值是1到10,OddThread只打印1到10之间的奇数,EvenThread只打印1到10之间的偶数。为此,我使用了线程的信号量来正确地进行通信。实际发生的情况是,OddThread只打印1,EvenThread只打印2,然后两者都被停止。我不了解实际发生的事情。任何人都能提出建议 public class ThreadProducerConsumerSemaphore { /**
public class ThreadProducerConsumerSemaphore {
/**
* @param args
*/
public static void main(String[] args) {
Semaphore p = new Semaphore(1);
Semaphore c = new Semaphore(0);
OddThread producer = new OddThread(p, c);
EvenThread consumer = new EvenThread(p, c);
Thread t1 = new Thread(producer, "Thread producer");
Thread t2 = new Thread(consumer, "Thread consumer");
t1.start();
t2.start();
}
}
class OddThread implements Runnable {
Semaphore p;
Semaphore c;
public OddThread(Semaphore p, Semaphore c) {
super();
this.p = p;
this.c = c;
}
int counter = 1;
@Override
public void run() {
while (true) {
try {
p.acquire(1);
System.out.println(Thread.currentThread().getName() + " "
+ counter);
if (counter == 10) {
break;
}
counter++;
c.release(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class EvenThread implements Runnable {
Semaphore p;
Semaphore c;
int counter = 2;
public EvenThread(Semaphore p, Semaphore c) {
super();
this.p = p;
this.c = c;
}
@Override
public void run() {
while (true) {
try {
c.acquire(1);
System.out.println(Thread.currentThread().getName() + " "
+ counter);
if (counter == 10) {
break;
}
counter=counter+2;
p.acquire(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
你的代码不可能是正确的,它甚至不是对称的
p.acquire(1);
c.release(1);
c.acquire(1);
p.acquire(1);
您的
EvenThread.run
方法同时获取c
和p
,而不是释放其中一个
然而,请注意,您的代码看起来并不像是在修复之后就可以正常退出。请考虑:两个线程都不会在信号量退出之前释放信号量,因此其中一个线程将不可避免地被阻塞。以下是您的问题:
............
c.acquire(1);
System.out.println(Thread.currentThread().getName() + " "
+ counter);
if (counter == 10) {
break;
}
counter=counter+2;
p.acquire(1); <--deadlock this has already been acquired by the other thread.
..............
。。。。。。。。。。。。
c、 获取(1);
System.out.println(Thread.currentThread().getName()+“”
+计数器);
如果(计数器==10){
打破
}
计数器=计数器+2;
p、 获取(1);