非阻塞Java方法

时间:2014-04-27 16:58:42

标签: java

假设我想要一个非阻塞的方法,并使应用程序继续保持原样,并且仍然可以获得返回值:

Key key = datastore.put(complexInstance);
String name = key.getName();
doSomethingWithTheName(name);

或者简单地说,对于某些无法运行线程超过30秒的Java环境。

put方法中的位置:

public Key put(Object instance){
  Key result = null;
  // In here process could take up time, say 30 seconds or more, IDK :-/
  return result; 
}

实现这一目标的策略是什么?

3 个答案:

答案 0 :(得分:1)

您可以将ExecutorService的实现与Future对象(http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html)结合使用。您只需启动一个新线程(或使用现有线程),然后可以获取结果。

答案 1 :(得分:1)

Java 8使这个过程变得更加简单:

//field in a manager class
ScheduledExecutorService es = Executors.newScheduledThreadPool(10);

//Schedule a task
es.schedule(() -> { /* contents of a runnable */ }, 0, TimeUnit.SECONDS);

否则,你仍然可以使用一个匿名的runnable与Scheduler:

es.schedule(new Runnable() {

    public void run() {
        /* do what you need */
    }

}, 0, TimeUnit.SECONDS);

但是,正如您指定的那样,您仍需要为返回的值执行某些操作。除了使用状态管理器中的某些东西,或者在可运行的内部执行相关方法之外,您还无法做很多事情。

答案 2 :(得分:0)

你的类需要使用一个线程池,可能是通过接口ExecutorService来运行方法。您可以将其设为private static变量,但更有可能将其传入或至少由客户端代码(将设置大小等)进行配置。

请注意,如果IO是异步部分,那么使用基于Java的nio框架构建的东西比使用大量线程更好。

您需要返回某种Future。至少通过Java 7(我不确定8),Java的未来库非常弱,省略了一些明显需要的功能。查看Functional Java或Google的图书馆。但是你会注意到许多库(Apache的MINA,亚马逊网络服务和Java SDK等)实现了他们自己的promise库来克服这些弱点。 (我在我公司的代码库中做了同样的事。哎呀。)