3线程锁定
问题描述:
我不明白我的错误,我会描述它,然后我会发布我的代码。 从main()我想运行3个线程(每个线程包含3个女性的循环)。 我有一种方法可以打印出每个进入洗手间的女人和每个出门的女人。我想要使用锁,因此每个线程中的每个女人都会在下一个线程发生之前写入每一个线程。输出应该是这样的: 女人0进入浴室 女人0离开浴室 女人1进入浴室 女人1分离开浴室 女人2进入浴室 女人2分离开浴室 ,然后2倍为每个线程。 我的问题是,只有一个线程正在写入,2个没有达到我释放锁之后仍在等待的锁。 这里是我的代码:(卫浴类)3线程锁定
private Lock lockW=new ReentrantLock();
public int women_present;
public BathRoom(){
women_present=0;//empty at start
}
public void woman_wants_to_enter (int i) {
lockW.lock();
women_present++;
System.out.println ("Woman " + i + " enters bathroom "); }
public void woman_leaves (int i) {
try {
Thread.sleep (1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println ("Woman " + i + " exits bathroom ");
if((women_present%3)==0){
women_present=0;
lockW.unlock();
} }
这是女性类:
private int i; /* This identifies the woman. */
private BathRoom bathroom;
public Woman (BathRoom bathroom,int i) {
this.i = i;
this.bathroom = bathroom;
}
public void run() {
for (int i = 0; i < 3; i++) {
try {
Thread.sleep ((long) (500 * Math.random()));
}catch (InterruptedException e) {
e.printStackTrace();
}
bathroom.woman_wants_to_enter (i);
bathroom.woman_leaves (i);
}
}}
答
我冒昧地修改代码:
package *;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class BathRoom {
private Lock lockW=new ReentrantLock();
private Condition c1=lockW.newCondition();
public int women_present;
public BathRoom(){
women_present=0;//empty at start
}
public void woman_wants_to_enter (int i) {
lockW.lock();
while(women_present!=i)
try {
c1.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println ("Woman " + i + " enters bathroom "); }
public void woman_leaves (int i) {
try {
Thread.sleep (1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println ("Woman " + i + " exits bathroom ");
women_present++;
if(women_present==3){
women_present=0;
}
c1.signal();
lockW.unlock();
}
}
class Woman implements Runnable{
private int i; /* This identifies the woman. */
private BathRoom bathroom;
public Woman (BathRoom bathroom,int i) {
this.i = i;
this.bathroom = bathroom;
}
public void run() {
for (int i = 0; i < 3; i++) {
try {
Thread.sleep ((long) (500 * Math.random()));
}catch (InterruptedException e) {
e.printStackTrace();
}
bathroom.woman_wants_to_enter (i);
bathroom.woman_leaves (i);
}
}
}
public class testdummy {
public static void main(String[] args) {
BathRoom b=new BathRoom();
Woman w0=new Woman(b, 0);
Woman w1=new Woman(b, 1);
Woman w2=new Woman(b, 2);
Thread A=new Thread(w0);
Thread B=new Thread(w1);
Thread C=new Thread(w2);
A.start();
B.start();
C.start();
}
}
我刚才所用条件对象的线程同步ACCE ss的方法,它不完美,但它的作品,希望它会给你一个更好的方法的想法。
'if((women_present%3)== 0){'test。如果数字*已经为零,那么你只能解锁,让无意义的'%3'放在一边......最后,你根本不需要'women_present'计数器。你为每个'woman_wants_to_enter'调用'lock()',因此,你必须为每个'woman_leaves'调用'unlock'。然后,你已经完成了。 – Holger
正如我所说,每个线程包含3名女性。 – demianr
我给出的问题是在每个线程完成后解锁,而不是每个女人在thread.you可以想到它像每个线程是一组3个女人。 – demianr