package thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockConditionTest {
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private boolean isMethod1 = false;
public void method1() {
lock.lock();
try {
try {
while (!isMethod1) {
condition.await(); // 类似于 this.wait();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// do something
isMethod1 = false;
condition.signal(); // 类似于 this.notify();
} finally {
lock.unlock();
}
}
public void method2() {
lock.lock();
try {
try {
while (isMethod1) {
condition.await();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// do something
isMethod1 = true;
condition.signal();
} finally {
lock.unlock();
}
}
}
实现3个方法(线程)间的协同
package thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockConditionTest {
/* 使用 condition 实现多个线程间的通信 */
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
private int method = 1;
public void method1() {
lock.lock();
try {
try {
while (method != 1) {
condition1.await();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// do something
method = 2;
condition2.signal();
} finally {
lock.unlock();
}
}
public void method2() {
lock.lock();
try {
try {
while (method != 2) {
condition2.await();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// do something
method = 3;
condition3.signal();
} finally {
lock.unlock();
}
}
public void method3() {
lock.lock();
try {
try {
while (method != 3) {
condition3.await();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// do something
method = 1;
condition1.signal();
} finally {
lock.unlock();
}
}
}