在多核场景中编写 Java 程序的提示 [已关闭]
2022-09-03 03:42:06
查看 Java 5 中添加的新 Java 并发工具(在 java.util.concurrent
包中)。它提供了比常规 s 更高级的功能,这将使编写并发应用程序更容易(并且不容易出错)。教训:Java教程的并发性将是一个很好的起点。Thread
到目前为止,我只使用了 ExecutorService
,它允许生成线程池,新任务可以以 Runnable
s 或 Callable
s 为单位传递到这些线程池(可以在执行后返回值作为 Future
s),并且实际的线程代码由 .ExecutorService
例如,使用包含 2 个线程的线程池执行一些计算,并获取结果可以很简单:
ExecutorService es = Executors.newFixedThreadPool(2);
Future f1 = es.submit(new Callable<Integer>() {
public Integer call()
{
// Do some processing...
return someInteger;
}
});
Future f2 = es.submit(new Callable<Integer>() {
public Integer call()
{
// Do some processing...
return someInteger;
}
});
Integer firstInteger = f1.get();
Integer secondInteger = f2.get();
在上面(未经测试的)代码中,我所要担心的就是制作几个s并将其提交给
和稍后,使用s来检索结果。Callable
ExecutorService
Future
问题是,一旦调用了 get
方法,如果处理未完成,程序将停止,直到可以检索到的结果。所以,在这个例子中,即使的结果在之前是可用的,程序也会等到的结果可用。Future
Future
f2
f1
f1
在阅读材料方面,我即将购买的书籍列表中是Brian Goetz的Java Concurrency in Practice,当Java中的并发性被提出时,它经常出现。
Java 5 文档中的“并发实用程序”页面也包含更多信息。
最好的提示必须是:正确进行同步!
这似乎有些明显,但了解Java内存模型至关重要,特别是易失性和最终字段的工作原理,同步如何同时充当互斥体和内存屏障,然后新构造也是如此。java.util.concurrent