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