【发布时间】:2011-04-28 21:31:51
【问题描述】:
你能发现错误吗?这将抛出一个java.lang.OutOfMemoryError。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestTheads {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(1);
while(true) {
executorService.submit(new Runnable() {
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
}
});
}
}
}
错误是我调用executorService.submit() 而不是executorService.execute(),因为submit() 返回一个我忽略的Future 对象。使用execute(),这个程序实际上将永远运行。
但是,并不总是拥有execute() 方法的奢侈,例如使用ScheduledExecutorService 时:
public static void main(String[] args) {
// this will FAIL because I ignore the ScheduledFuture object
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
while(true) {
executorService.scheduleWithFixedDelay(new Runnable() {
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
}
}, 1, 1, TimeUnit.SECONDS);
}
}
对于不返回任何内容、仅计算的任务应该如何处理?
任何想法将不胜感激!
编辑:ThreadPoolExecutors purge() 看起来很有希望,但它只会清除已取消的任务。
【问题讨论】:
-
在返回的
Future上调用get()是否有效?只需在结尾;之前添加.get()。尽管我认为这会阻止并破坏使用ExecutorService的全部目的。您必须保存Future引用,遍历它们并调用get()。 -
@laz:是的,我认为这有点违背
ExecutorService的目的。不过,我所做的一些解决方法依赖于存储和迭代。
标签: java concurrency java.util.concurrent