gpt4 book ai didi

java - 你如何获得 "ignore"java.util.concurrent.Future 对象?

转载 作者:搜寻专家 更新时间:2023-11-01 01:09:14 25 4
gpt4 key购买 nike

你能找出错误吗?这将抛出 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);
}
}

对于不返回任何东西、只计算的任务应该做什么?

任何想法将不胜感激!

编辑:ThreadPoolExecutor s purge()看起来很有希望,但它只会清除已取消的任务。

最佳答案

返回的Future对象被ExecutorService强引用直到它被执行。(它实际上是一个委托(delegate)给 Runnable 的 FutureTask 实例。)一旦执行,它将被垃圾收集,因为调用者没有对它的引用。换句话说,内存问题与Future的处理无关。

如果内存不足,那是因为工作队列有数百万个任务在排队。与任何队列一样,除非平均消费率超过平均生产率,否则队列将填满。队列的内容消耗内存。

使用有界队列,这将有效地限制任务排队,或获得更多内存。

此代码将“永远”运行:

  ExecutorService executorService = Executors.newFixedThreadPool(1);
while(true) {
executorService.submit(new Runnable() {
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e) { }
}
});
Thread.sleep(12);
}

区别不在于对生成的 Future 实例的处理,而是任务以​​它们可以被处理的速率排队。

关于java - 你如何获得 "ignore"java.util.concurrent.Future 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5825290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com