Java CountDownLatch 异步转同步的实现方法

来源:互联网 发布:mac brew install jdk 编辑:程序博客网 时间:2024/06/13 16:05

用Java调用一个异步方法时,方法会马上返回,而结果会在之后再去取
例如:

public void invoke(Runnable task) {    threadPool.execute(task);}//或者public <T> Future<T> submit(Callable<T> task) {    return threadPool.submit(task);}

以上方法都是异步的,对于需要得到返回结果的,可以通过future.get()来取得结果。

我的问题是:

如果一个方法一开始是异步的,我想把它转成同步来用,应该做哪些修改,或者是添加哪些类和逻辑?

Java中的异步转同步有没有哪些一般的编程模式?据说用CountDownLatch也可以实现异步转同步,但我还不太理解。

这个例子可以把异步的转成同步的:

public synchronized TIMMessage queryLatestMessage(TIMConversation conversation) throws InterruptedException {        final CountDownLatch latch = new CountDownLatch(1);        final List<TIMMessage> typeMessages = new ArrayList<>();        conversation.getMessage(1, null, new TIMValueCallBack<List<TIMMessage>>() {            @Override            public void onError(int code, String desc) {                latch.countDown();            }            @Override            public void onSuccess(List<TIMMessage> msgs) {                TIMMessage msg0 = null;                if (msgs.size() < 1) {                    return;                }                for (TIMMessage msg : msgs) {                    if (msg.status() != TIMMessageStatus.HasDeleted) {                        typeMessages.add(msg);                        break;                    }                }                latch.countDown();            }        });        latch.await();        if (typeMessages.size() > 0) {            return typeMessages.get(0);        } else {            return null;        }    }


0 0
原创粉丝点击