【发布时间】:2010-12-22 23:59:11
【问题描述】:
我最近一直在看Go's goroutines,并认为在 Java 中有类似的东西会很好。据我搜索并行化方法调用的常用方法是执行以下操作:
final String x = "somethingelse";
new Thread(new Runnable() {
public void run() {
x.matches("something");
}
}).start();
那不是很优雅。 有更好的方法吗?我在一个项目中需要这样的解决方案,所以我决定围绕异步方法调用实现我自己的包装类。
我在J-Go 中发布了我的包装类。但我不知道这是否是一个好的解决方案。用法很简单:
SampleClass obj = ...
FutureResult<Integer> 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 的类并做一些反射工作来获取正确的方法对象并调用它。
我想对我的小型库以及在 Java 中进行这样的异步方法调用的主题提出一些意见。安全吗?有没有更简单的方法?
【问题讨论】:
-
你能再展示一下你的J-Go lib代码吗?
-
我正在做一个项目,我正在阅读流字符。一旦阅读了一个完整的单词,我就会对该单词执行许多操作。最后我把它放到了一个集合中。读取流中的所有数据后,我将返回响应。我决定每次对一个单词执行操作时都启动线程。但它降低了整体性能。然后我才知道线程本身就是一项昂贵的操作。我不确定启动一个线程并发调用一个方法是否可以增加任何性能,直到它执行任何繁重的 IO 操作。
-
好问题!! Java 8 为此提供了 CompletableFutures。其他答案可能基于 Java 的旧版本
标签: java concurrency asynchronous goroutine