Java相当于C#Action.BeginInvoke

时间:2012-03-12 14:44:13

标签: c# java delegates begininvoke

我有这个C#代码:

Action action = MyFunction;
action.BeginInvoke(action.EndInvoke, action);

从我所知道的,只是异步运行MyFunction。你能用Java做同样的事情吗?

3 个答案:

答案 0 :(得分:5)

这就是你可以在Java中用自己的线程运行一个动作的方法:

new Thread(new Runnable() {

    @Override
    public void run() {
        aFunctionThatRunsAsynchronously();
    }
}).start();

还有其他更高级别的框架可以让您更好地控制运行方式,例如Executors,例如可以用于schedule events

答案 1 :(得分:2)

本地,ExecutorService提供了我能想到的最接近的。以下是如何使用ExecutorService运行方法异步,然后在以后获取返回值:

ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);
Future<String> future = executor.submit(new Callable<String>() {
    return getSomeLongRunningSomethingHere();
});
//... do other stuff here
String rtnValue = future.get(); //get blocks until the original finishes running 
System.out.println(rtnValue);

答案 2 :(得分:1)

这与Asynchronous Event Dispatch in Java有些相关。基本上,您可以构建要作为实现Callable或Runnable的类运行的方法。 Java无法像C#那样将“方法组”称为变量或参数,因此Java中的事件处理程序也是实现定义侦听器的接口的类。

尝试这样的事情:

Executor scheduler = Executors.newSingleThreadExecutor();

//You'd have to change MyFunction to be a class implementing Callable or Runnable
scheduler.submit(MyFunction);

更多来自Oracle Java文档的阅读:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executors.html

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html