显式锁和条件变量 Java 生产者消费者
Explicit Locks and Condition Variables Java Producer Consumer
我正在尝试 运行 我从 http://www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/explicitlocks.html 获得的生产者消费者示例,代码如下。当我 运行 它时,它只是 运行 两次并且似乎挂起。密码似乎可以正确解锁和发出信号,有谁知道我错过了什么。
static Thread t1;
static Thread t2;
public static void main(String[] args){
Lab2 r1=new Lab2();
Lab2 r2=new Lab2();
t1=new Thread(r1, "producer");
t2= new Thread(r2, "consumer");
//System.out.println("Adding");
t1.start();
t2.start();
}
public int get(int who) {
aLock.lock();
System.out.println("locked1");
try {
while (available == false) {
try {
System.out.println("false avail waiting");
condVar.await();
System.out.println("false avail waiting done");
} catch (InterruptedException e) { }
}
available = false;
System.out.println("Consumer " + who + " got: " +
contents);
condVar.signalAll();
} finally {
aLock.unlock();
return contents;
}
}
public void put(int who, int value) {
aLock.lock();
System.out.println("locked");
try {
while (available == true) {
System.out.println("true avail");
try {
condVar.await();
} catch (InterruptedException e) { }
}
contents = value;
available = true;
System.out.println("Producer " + who + " put: " +contents);
condVar.signalAll();
//condVar.signal();
} finally {
aLock.unlock();
}
}
public void run() {
//System.out.println(Thread.currentThread().getName()+" Thread started");
int i=0;
//System.out.println("Adding");
while(i<10){
i++;
//System.out.println(i);
if (Thread.currentThread().getName().equals("producer")){
get(2);
//producer();
}
else{
put(2,1);
//consumer();
}
//break;
}
}
您的问题在这里:
Lab2 r1=new Lab2();
Lab2 r2=new Lab2();
t1=new Thread(r1, "producer");
t2= new Thread(r2, "consumer");
即你有两个线程执行独立的 runnables (r1, r2) 但它们应该提供相同的 runnable。
替换为:
Lab2 r=new Lab2();
t1=new Thread(r, "producer");
t2= new Thread(r, "consumer");
我正在尝试 运行 我从 http://www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/explicitlocks.html 获得的生产者消费者示例,代码如下。当我 运行 它时,它只是 运行 两次并且似乎挂起。密码似乎可以正确解锁和发出信号,有谁知道我错过了什么。
static Thread t1;
static Thread t2;
public static void main(String[] args){
Lab2 r1=new Lab2();
Lab2 r2=new Lab2();
t1=new Thread(r1, "producer");
t2= new Thread(r2, "consumer");
//System.out.println("Adding");
t1.start();
t2.start();
}
public int get(int who) {
aLock.lock();
System.out.println("locked1");
try {
while (available == false) {
try {
System.out.println("false avail waiting");
condVar.await();
System.out.println("false avail waiting done");
} catch (InterruptedException e) { }
}
available = false;
System.out.println("Consumer " + who + " got: " +
contents);
condVar.signalAll();
} finally {
aLock.unlock();
return contents;
}
}
public void put(int who, int value) {
aLock.lock();
System.out.println("locked");
try {
while (available == true) {
System.out.println("true avail");
try {
condVar.await();
} catch (InterruptedException e) { }
}
contents = value;
available = true;
System.out.println("Producer " + who + " put: " +contents);
condVar.signalAll();
//condVar.signal();
} finally {
aLock.unlock();
}
}
public void run() {
//System.out.println(Thread.currentThread().getName()+" Thread started");
int i=0;
//System.out.println("Adding");
while(i<10){
i++;
//System.out.println(i);
if (Thread.currentThread().getName().equals("producer")){
get(2);
//producer();
}
else{
put(2,1);
//consumer();
}
//break;
}
}
您的问题在这里:
Lab2 r1=new Lab2();
Lab2 r2=new Lab2();
t1=new Thread(r1, "producer");
t2= new Thread(r2, "consumer");
即你有两个线程执行独立的 runnables (r1, r2) 但它们应该提供相同的 runnable。
替换为:
Lab2 r=new Lab2();
t1=new Thread(r, "producer");
t2= new Thread(r, "consumer");