保护性暂停模式
Guarded Suspension Pattern
线程间通信模型,Future和Promise的实现原理
代码实现:
class GuardedSuspension {
private Object response;
public Object get () {
synchronized (this) {
while (response == null) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return response;
}
}
public void complete (Object response) {
synchronized (this) {
this.response = response;
this.notifyAll();
}
}
}
测试代码:
public class GuardedSuspensionTest {
public static void main(String[] args) throws InterruptedException {
GuardedSuspension pattern = new GuardedSuspension();
Thread thread = new Thread(() -> {
System.out.println("等待结果...");
System.out.println(pattern.get());;
}, "monitor");
Thread waiter = new Thread(() -> {
Integer result = 0;
try {
for (int i = 0; i < 10; i++) {
result = i++;
System.out.println("运算中...");
TimeUnit.MILLISECONDS.sleep(200);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("正在生成结果...");
pattern.complete(result);
});
thread.start();
waiter.start();
thread.join();
waiter.join();
}
}
运行结果:
解耦式保护性暂停
代码实现:
// 消费者
class Consumer extends Thread {
@Override
public void run() {
Goods goods = Factory.produce();
System.out.printf("等待商品(%d)...\n", goods.getId());
Object result = goods.get(5000);
System.out.printf("收到商品(%d): %s\n", goods.getId(), result);
}
}
// 生产者
class Producer extends Thread {
private final int id;
private final String name;
public Producer (int id, String name) {
this.id = id;
this.name = name;
}
@Override
public void run() {
Goods goods = Factory.get(id);
System.out.printf("生产商品(%d)中...\n", goods.getId());
goods.complete(name);
}
}
// 工厂类
class Factory {
private static final Map<Integer, Goods> goodsMap = new Hashtable<>();
private static int id = 1;
private static synchronized int generateId () {
return id ++;
}
public static Goods produce () {
Goods goods = new Goods(generateId());
goodsMap.put(goods.getId(), goods);
return goods;
}
public static Goods get (int id) {
return goodsMap.remove(id);
}
public static Set<Integer> getIds () {
return goodsMap.keySet();
}
}
// 商品
class Goods {
private final int id;
private Object response;
public int getId() {
return id;
}
public Object get(long timeout) {
synchronized (this) {
long begin = System.currentTimeMillis();
long now;
while (response == null) {
now = System.currentTimeMillis();
if (now - begin > timeout) {
break;
}
try {
this.wait(timeout);
} catch (InterruptedException e) {
// e.printStackTrace();
}
}
return response;
}
}
public void complete(Object response) {
synchronized (this) {
this.response = response;
this.notifyAll();
}
}
public Goods (int id) {
this.id = id;
}
}
测试代码:
public class GuardedSuspension {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 3; i++) {
new Consumer().start();
}
TimeUnit.SECONDS.sleep(1);
for (Integer id : Factory.getIds()) {
new Producer(id, "衣服" + id).start();
}
}
}
运行效果: