Я работаю над приложением, которое должно получить список пользователей из базы данных и обновить данные из каталога (ldap или AD). Я, что делать эту процедуру на многоядерной машине, поэтому я создал это приложение (код ниже). Я использую CompletionService и получаю результаты в объекте Future.
Через некоторое время я получаю сообщение об ошибке «Недостаточно создать новый собственный поток». В диспетчере задач я вижу, что приложение создает огромное количество потоков, но я попросил создать фиксированный пул потоков с размером равным количеству моих процессоров.
Что не так с моим кодом?
class CheckGroupMembership {
public static void main(String[] args) throws Exception {
final ExecutorService executor = Executors.newFixedThreadPool(**Runtime.getRuntime().availableProcessors()**);
CompletionService<LdapPerson> completionService =
new ExecutorCompletionService(executor)<LdapPerson>(executor);
final int limit = 2000;
DocumentService service1 = new DocumentService();
List<String> userNamesList = service1.getUsersListFromDB(limit);
List<LdapPerson> ldapPersonList = new ArrayList() <LdapPerson> (userNamesList.size());
LdapPerson person;
for (String userName : userNamesList) {
completionService.submit(new GetUsersDLTask(userName));
}
try {
for (int i = 0, n = userNamesList.size(); i < n; i++) {
Future<LdapPerson> f = completionService.take();
person = f.get();
ldapPersonList.add(person);
}
} catch (InterruptedException e) {
System.out.println("InterruptedException error:" + e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
ОШИБКА CheckGroupMembership: 85 - java.lang.OutOfMemoryError: невозможно создать новый собственный поток
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: невозможно создать новый собственный поток
в java.util.concurrent.FutureTask $ Sync.innerGet (FutureTask.java:222)
в java.util.concurrent.FutureTask.get (FutureTask.java:83
Задача GetuserDLs
public class GetUsersDLTask implements Callable<LdapPerson> {
private String userName;
public GetUsersDLTask(String u) {
this.userName = u;
}
@Override
public LdapPerson call() throws Exception {
LdapService service = new LdapService();
return service.getUsersDLs(userName);
}
}