Java异步转同步的实现方法 -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Java异步转同步的实现方法

用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也可以实现异步转同步,但我还不太理解。
等待各位解答,先谢谢!

展开
收起
蛮大人123 2016-02-27 14:53:41 4947 0
1 条回答
写回答
取消 提交回答
  • 蛮大人123
    我说我不帅他们就打我,还说我虚伪
    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;
            }
        }
    2019-07-17 18:48:53
    赞同 展开评论 打赏
问答分类:
相关产品:
问答排行榜
最热
最新
相关电子书
更多
JAVA 应用排查全景图
立即下载
Java工程师必读手册
立即下载
Java应用提速(速度与激情)
立即下载