Multithreading 信号量未按预期工作,正在被锁定

Multithreading 信号量未按预期工作,正在被锁定,multithreading,semaphore,Multithreading,Semaphore,我使用信号量进行线程通信我有两个线程一个是OddThread,另一个是EvenThread,我打印的值是1到10,OddThread只打印1到10之间的奇数,EvenThread只打印1到10之间的偶数。为此,我使用了线程的信号量来正确地进行通信。实际发生的情况是,OddThread只打印1,EvenThread只打印2,然后两者都被停止。我不了解实际发生的事情。任何人都能提出建议 public class ThreadProducerConsumerSemaphore { /**

我使用信号量进行线程通信我有两个线程一个是OddThread,另一个是EvenThread,我打印的值是1到10,OddThread只打印1到10之间的奇数,EvenThread只打印1到10之间的偶数。为此,我使用了线程的信号量来正确地进行通信。实际发生的情况是,OddThread只打印1,EvenThread只打印2,然后两者都被停止。我不了解实际发生的事情。任何人都能提出建议

   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);