异步 java_如何在Java中异步调用方法

问题

我一直在关注Go's goroutines,认为在Java中有类似的东西会很好。据我所知,并行化方法调用的常用方法是执行以下操作:

final String x = "somethingelse";

new Thread(new Runnable() {

public void run() {

x.matches("something");

}

}).start();

这不是很优雅.**有更好的方法吗?**我在项目中需要这样的解决方案,所以我决定围绕异步方法调用实现自己的包装类。

我在J-Go发表了我的包装课程。但我不知道这是不是一个好的解决方案。用法很简单:

SampleClass obj = ...

FutureResult res = ...

Go go = new Go(obj);

go.callLater(res, "intReturningMethod", 10); //10 is a Integer method parameter

//... Do something else

//...

System.out.println("Result: "+res.get()); //Blocks until intReturningMethod returns

或者更简洁:

Go.with(obj).callLater("myRandomMethod");

//... Go away

if (Go.lastResult().isReady()) //Blocks until myRandomMethod has ended

System.out.println("Method is finished!");

在内部,我正在使用一个实现Runnable的类,并做一些Reflection工作来获取正确的方法对象并调用它。

我想对我的小型库以及在Java中进行这样的异步方法调用的主题有所了解。安全吗?有没有更简单的方法?

#1 热门回答(105 赞)

我刚刚发现有一种更清洁的方法可以做到

new Thread(new Runnable() {

public void run() {

//Do whatever

}

}).start();

(至少在Java 8中),你可以使用lambda表达式将其缩短为:

new Thread(() -> {

//Do whatever

}).start();

就像在JS中创建一个函数一样简单!

#2 热门回答(26 赞)

你可能还希望考虑类java.util.concurrent.FutureTask。

如果你使用的是Java 5或更高版本,则FutureTask是"可取消异步计算"的交钥匙实现。

在java.util.concurrent包中可以使用更丰富的异步执行调度行为(例如,ScheduledExecutorService),但是FutureTask可能具有你需要的所有功能。

我甚至会说,自FutureTask以来,使用你提供的第一个代码模式不再可取。 (假设你使用的是Java 5或更高版本。)

#3 热门回答(17 赞)

我不喜欢使用Reflection的想法。

不仅在某些重构中丢失它是危险的,但它也可以被SecurityManager拒绝。

FutureTask是java.util.concurrent包中的其他选项的一个很好的选择。

我最喜欢的简单任务:

Executors.newSingleThreadExecutor().submit(task);

比创建线程短bit(任务是Callable或Runnable)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值