Test类:
public class Test{

public static void main(String[] args) {
ReentrantLock r = new ReentrantLock();
Condition con = r.newCondition();
Business b = new Business(con);
for(int i=0;i<10;i++){
new T(i+"线程",r,con).start();
}
b.start();
}
}public class T extends Thread {
String n;
ReentrantLock r;
Condition c;
public T(String name,ReentrantLock l,Condition con){
r = l;
n = name;
c = con;
}
public void run(){
r.lock();
for(int i=0;i<100;i++){
//在这个地方上锁
while(i==3)
try {
c.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
//到这个地方
System.out.println(n+"线程   "+i);
}
r.unlock();
}
}public class Business extends Thread{
Condition con;
int k = 0;
public Business(Condition c){
con = c;
}

public void run(){
con.signalAll();
}
}
现在的问题是:只要调用con.signalAll()就会报异常
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.signalAll(AbstractQueuedSynchronizer.java:1685)
at com.test.Business.run(Business.java:12)
感觉Condition还是没有理解,高手帮忙调调

解决方案 »

  1.   

    使用Condition也是为了使线程之间进行协作,跟wait()和notify()方法一样。那为什么要使用Condition呢?是因为signalALL()比notifyAll()更安全。
    wait(),notify(),signal(),await(),这些方法必须写在锁作用域内,否则就会抛出上面的异常。public class Test { public static void main(String[] args) {
    ReentrantLock r = new ReentrantLock();
    Condition con = r.newCondition();
    Business b = new Business(r, con);
    for (int i = 0; i < 10; i++) {
    new TNT(i + "线程", r, con).start();
    }
    b.start();
    }
    }class TNT extends Thread {
    String n;
    ReentrantLock r;
    Condition c; public TNT(String name, ReentrantLock l, Condition con) {
    r = l;
    n = name;
    c = con;
    } public void run() {
    r.lock();
    for (int i = 0; i < 100; i++) {
    // 在这个地方上锁
    while (i == 3)
    try {
    c.await();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    // 到这个地方
    System.out.println(n + "线程  " + i);
    }
    r.unlock();
    }
    }class Business extends Thread {
    Condition con;
    ReentrantLock r;
    int k = 0; public Business(ReentrantLock r, Condition c) {
    this.r = r;
    con = c;
    } public void run() {
    r.lock(); //这里也需要加锁。
    con.signalAll();
    r.unlock();
    }
    }
      

  2.   

    wait(),notify(),signal(),await(),这些方法必须写在锁作用域内,否则就会抛出上面的异常。 
    楼上的,!!!!
      

  3.   

    不是帮你改过了么。class Business extends Thread { 
    Condition con; 
    ReentrantLock r; 
    int k = 0; public Business(ReentrantLock r, Condition c) { 
    this.r = r; 
    con = c; 
    } public void run() { 
    r.lock(); //这里也需要加锁。 
    con.signalAll(); 
    r.unlock(); 

    }