Java 实现 Awaitable(多线程并行等待,类似 AutoEventReset 的作用)

 AutoEventReset、ManualEventReset,是我们在多线程并行编程之中常常需要涉及的,但是 ManualEventReset 可能用的并没有那么多,这个多用于实现读写锁的,当然 Java 自己库提供了官方实现,就没必要自己去整了。

C/C++ 里面的话,这块基本都是自己写的,毕竟标准库STL得功能咋个说,这块太弱了,说没也有点东西,说有东西又差了很多点的意思,得自己上马搞底层造轮子,总之奇奇怪怪。

 java 这里面得话,官方提供了 CountDownLatch 类可以模拟实现这个效果,但是呢必须封装一下,否则不太好用,就跟 C/C++1xx 之中得 std::condition_variable 不封装下,用起来不太顺手。

Awaitable 直接说,就两核心接口:

1、await(那个线程要等待其它线程任务结束就执行这个)

2、 processed (其它处理任务得线程完成了调用这个,顾名思义:处理结束)

这种需求很正常得,并非所有情况都适用协程或FULL ASYNC得情况,至于协程JAVA得额滴不太懂,本人就一JAVA,N多年没在摸过得划水半吊子,只是近期整下安卓APP开源解决方案需要重新涉及下JAVA语言整整软件底层实现,仅此而已。

例子:

        Awaitable awaitable = new Awaitable();
        new Thread(() -> {
            System.out.println("B\n");
            awaitable.processed();
        }).start();

        awaitable.await();
        System.out.println("A\n");

源实现:

public class Awaitable {
    private final AtomicReference<Event> event_ = new AtomicReference<>();
    private Object tag_ = null;

    private static class Event {
        private final CountDownLatch lk_ = new CountDownLatch(1);

        public boolean processed() {
            try {
                lk_.countDown();
                return true;
            } catch (Throwable ignored) {
                return false;
            }
        }

        public boolean await() {
            try {
                lk_.await();
                return true;
            } catch (Throwable ignored) {
                return false;
            }
        }
    }

    public void tag(Object v) {
        this.tag_ = v;
    }

    public Object tag() {
        return this.tag_;
    }

    // B Thread call.
    public boolean processed() {
        Event event = this.event_.getAndSet(null);
        if (event == null) {
            return false;
        }

        return event.processed();
    }

    // A Thread call.
    public boolean await() {
        Event event = new Event();
        if (this.event_.compareAndSet(null, event)) {
            return event.await();
        }

        return false;
    }
}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值