Java 异步方法转同步

原创 2013年12月04日 17:38:32

Java 异步方法转同步

有一些api提供的方法是异步的,这类的方法大概类型如下:

private void asyMethod( String param,RequestCallback callback){
        heavyWork();
        callback.callback(param);
    }

    private void heavyWork(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
        }
    }

其中的:heavyWork 是我们不能够控制的,也是被封装到api中的,但是我想要同步的形式来进行调用,想到了用线程来进行同步。简单的就想到了闭锁《Java并发实战》中有说明:闭锁是一种同步工具类,可以延迟线程的进度知道达到其终止状态[CPJ 3.4.2]。闭锁的作用相当于一扇门:在闭锁到到结束状态之前,这扇门一直是关闭的,并没有任何线程能够通过,当到达结束状态时,这扇门将会打开并允许所有的线程通过。当闭锁达到结束状态时,将不会再改变状态,因此这扇门将会永远的保持打开状态。闭锁额可以用来确保某些活动直到其他活动都完成后才继续执行。

因此:我们可以这么来使用:

 private String getHeavyCallbackResult(){
        final String[] a = {null};
        final CountDownLatch latch = new CountDownLatch(1);
        new Thread(new Runnable() {
            @Override
            public void run() {
                asyMethod("getHeavyCallbackResult",new RequestCallback() {
                    @Override
                    public void callback(String result) {
                        a[0] = result;
                        latch.countDown();
                    }
                });
            }
        }).start();

        try {
            latch.await();
        } catch (InterruptedException e) {
        }
        return a[0];
    }
这样就达到异步转同步的目的。

参考:

http://kongji.wordpress.com/2010/09/21/%E5%88%A9%E7%94%A8countdownlatch%E6%8A%8A%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8%E8%BD%AC%E5%90%8C%E6%AD%A5%E8%B0%83%E7%94%A8/

《完》



相关文章推荐

java 总结几种线程异步转同步的方法

今天在做app的时候,用到了一个异步执行的api,而我想要的是同步执行,查了一些资料,对几种情况下的线程同步做一下总结。 一、共享资源的同步: 当一个资源被多个线程访问会发生错误,只能允许一个线程...
  • Veson__
  • Veson__
  • 2016年12月28日 11:36
  • 2916

非主流node.js异步转同步

异步转同步方案分类 说起nodejs的异步转同步,估计大家不陌生。因为nodejs回调实在太多了,稍微复杂一点的程序就会有很多层的回调嵌套。为了处理这些令人抓狂的回调,我们一般需要使用一些框架或...

java中的同步与异步

经常看到介绍 ArrayList 和HashMap是异步,Vector和HashTable是同步,这里同步是线程安全的,异步不是线程安全的,举例说明:  当创建一个Vector对象时候,  ...

java 异步转同步工具类

package com.test.sync; import java.util.Iterator; import java.util.Map; import java.util.concurrent...
  • Mchange
  • Mchange
  • 2016年01月04日 16:05
  • 986

java的同步方法异步处理

有时需要处理一个大任务,这个大任务处理完可能需要80秒,如果按照正常来访问就会出现超时,这时就会想着把这个大任务拆分,比如可以分成两个(根据任务性质来拆分)可以并行处理的子任务,第一个子任务用时30秒...

Java同步代码转异步代码

 Java同步代码转异步代码Kagula2009-11-18摘要Thread   Thread Group概要   利用Java源码,介绍同步代码转异步代码框架的使用,下半部份附框架源代码,阅读本文之...

如何将同步调用转换成异步调用

同步/非同步本来是IO方面的概念,不过我们可以把函数乃至各种RPC理解成一种IO设备,这样就可以把这两个词扩展到函数调用领域了。同步的函数调用指的是当函数调用返回的时候,需要函数干的事已经完成。而异步...

java 总结几种线程异步转同步的方法

今天在做app的时候,用到了一个异步执行的api,而我想要的是同步执行,查了一些资料,对几种情况下的线程同步做一下总结。 一、共享资源的同步: 当一个资源被多个线程访问会发生错误,只能允许一个线程...
  • Veson__
  • Veson__
  • 2016年12月28日 11:36
  • 2916

ViewFlipper实现滚动布局

今天在git上面看到了一个 仿淘宝头条的滚动效果,就看了下源码        然后自己照着写了下  然后顺便看了下 ViewFlipper 这个类 先上效果图吧: 自定义类继承 ViewFli...

java 同步调用第三方sdk提供异步监听方法

CountDownLatch类的用法: 今日碰到这样的问题。调用第三方sdk的方式提供的api,发现api以监听的方式异步返回结果,而我方要求提供实时数据给用户,所以这里就涉及到第三方异步接口同步调...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 异步方法转同步
举报原因:
原因补充:

(最多只允许输入30个字)