Object和Condition
Object类中的方法有很多可以使用Condition中的方法来代替。
Object | Condition |
---|---|
wait() | await() |
wait(long timeout) | await(long time,TimeUnit unit) |
notify() | signal() |
notifyAll() | signalAll() |
由这张表可以得知,Condition类可以实现线程通信。
Lock &&Condition 实现生产者/消费者模式
示例代码:
package hello;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class ObjectValue {
public static String Value = "";
}
class Service {
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void setValue() {
try {
lock.lock();
while (!ObjectValue.Value.equals("")) {
condition.await();
}
String value = System.currentTimeMillis() + "_" + System.nanoTime();
System.out.println("set的值是:" + value);
ObjectValue.Value = value;
condition.signal();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void getValue() {
try {
lock.lock();
while (ObjectValue.Value.equals("")) {
condition.await();
}
System.out.println("get 的值是:" + ObjectValue.Value);
ObjectValue.Value = "";
condition.signal();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
class ThreadP extends Thread {
private Service service;
public ThreadP(Service service) {
this.service = service;
}
@Override
public void run() {
while (true) {
this.service.setValue();
}
}
}
class ThreadC extends Thread {
private Service service;
public ThreadC(Service service) {
this.service = service;
}
@Override
public void run() {
while (true) {
this.service.getValue();
}
}
}
public class Main {
public static void main(String[] args) {
Service service = new Service();
ThreadP threadp = new ThreadP(service);
threadp.start();
ThreadC threadc = new ThreadC(service);
threadc.start();
}
}
和synchronized(Object lock)差不多:
运行结果:
部分
set的值是:1507639004441_32000465052113
get 的值是:1507639004441_32000465052113
set的值是:1507639004441_32000465066481
get 的值是:1507639004441_32000465066481
set的值是:1507639004441_32000465078797
get 的值是:1507639004441_32000465078797
set的值是:1507639004441_32000465090702
get 的值是:1507639004441_32000465090702
set的值是:1507639004441_32000465103018
get 的值是:1507639004441_32000465103018
set的值是:1507639004441_32000465114923
get 的值是:1507639004441_32000465114923
set的值是:1507639004441_32000465129702
get 的值是:1507639004441_32000465129702
set的值是:1507639004441_32000465141607
get 的值是:1507639004441_32000465141607
set的值是:1507639004441_32000465153922