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还是没有理解,高手帮忙调调
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还是没有理解,高手帮忙调调
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();
}
}
楼上的,!!!!
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();
}
}