Java异步转同步的实现方法
大家讲道理
大家讲道理 2017-04-17 13:36:02
[Java讨论组]

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

javapublic void invoke(Runnable task) {
    threadPool.execute(task);
}

//或者

public <T> Future<T> submit(Callable<T> task) {
    return threadPool.submit(task);
}

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

我的问题是:

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

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

等待各位解答,先谢谢!

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(3)
天蓬老师

异步转同步一般思路就是轮询, 等待线程一直查询一个bool变量值, 执行线程在任务结束时候设置为bool为true, 这样等待线程接着就可以向下执行了

阿神

Guava 有一个ListenableFuture 可以看看http://www.cnblogs.com/hupengcool/p/3991310.html

黄舟
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;
        }
    }
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号