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
  • 4162

java 异步转同步工具类

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

JAVA同步转异步

客户端使用,代码清洁,装饰器模式   public class JobHandlerAsyncDemo { public static class JobHandlerDirect ...
  • tenebaul
  • tenebaul
  • 2013年10月29日 18:07
  • 1103

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

用Java调用一个异步方法时,方法会马上返回,而结果会在之后再去取 例如: public void invoke(Runnable task) { threadPool.execute(tas...
  • mingtianhaiyouwo
  • mingtianhaiyouwo
  • 2016年03月28日 10:00
  • 870

java 异步请求转同步结果

package com.test.sync; import java.util.Iterator; import java.util.Map; import java.util.concurrent...
  • Mchange
  • Mchange
  • 2016年03月10日 10:50
  • 926

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

在做一款app的时候,用到了一个异步执行的api,而我想要的是同步执行,查了一些资料,对几种情况下的线程同步做一下总结。 一、共享资源的同步 问题:当一个资源被多个线程访问会发...
  • quan7394
  • quan7394
  • 2017年09月06日 23:55
  • 180

异步操作转同步

前些日子转化图片又用到了异步操作转同步操作,用User::WaitForRequest() 函数阻塞等待实现同步,但当频繁操作时会出现异常(转化4张图片内没有问题,当大批量的时候就会报错)故通过CAc...
  • zaitianaoxiang
  • zaitianaoxiang
  • 2011年03月05日 15:10
  • 1593

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

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

异步转同步实例

  • 2016年02月03日 21:30
  • 20.22MB
  • 下载

ajax方法异步与同步的转换

ajax技术,相信开发web的都耳熟能详了!但是ajax能实现同步吗?能! ajax:Asynchronous Javascript And XML 异步不刷新技术 (http://www.r...
  • SchopenhauerZhang
  • SchopenhauerZhang
  • 2016年12月05日 14:41
  • 4507
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 异步方法转同步
举报原因:
原因补充:

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