我的应用程序中有一个类。
public Robot implements Callable<String> {
@Override
public String call() {
synchronized (monitor) {
while (true) {
/// doing somthing
monitor.wait(15000L)
}
}
}
}
然后有一个启动 Robot 对象的服务类
List<Robot> robots = <10000 роботов>
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setMaxPoolSize(robots.size());
threadPoolTaskExecutor.setCorePoolSize(robots.size());
threadPoolTaskExecutor.initialize();
for (Robot robot : robots) {
try {
Future<String> result = threadPoolTaskExecutor.submit(robot);
} catch (Exception e) {
log.warn("", e);
}
}
如果我像这样运行它,我会得到
[70,174s][warning][os,thread] Failed to start thread - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 0k, detached.
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached
关键是每个机器人每 15 秒执行一次动作并入睡。
动作本身只需要几分之一秒。
有一个想法是采用一个线程池,并在一个循环中,每 15 秒一次,通过它运行一个机器人列表。但是我有一个条件,即机器人执行第一个动作时有随机延迟,所有其他重复动作在前一个动作之后的间隔约为 15 秒。而且我不知道该怎么做...