保护性暂停模式

Java
395
0
0
2022-04-21

保护性暂停模式

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();
        }
    }
}

运行效果:

保护性暂停模式