Есть следующая проблема: в своей программе вызываю одну и ту же процедуру с разными параметрами в разных потоках, количество различных вызовов может превышать 60000, в результате чего возникают ошибки связанные с памятью и обрабатывается нормально только первая тысяча. Я разбил потоки по группам по 254 потока, они выполняются, выводится результат и заново создаются 254 потока и так далее, но проблема не исчезла. Я новичёк в Java, прошу подсказать как исправить ситуацию.
Вот код:
public class ResultScan implements Callable<String> { private String id, name; private int version; private long timeout; private String[] oid = { "1.3.6.1.2.1.1.1", "1.3.6.1.2.1.17.4.3.1.1","1.3.6.1.2.1.17.4.3.1.2" }; public ResultScan(String id, String name, int version, long timeout){ this.id = id; this.name = name; this.version = version; this.timeout = timeout; } public String call() throws IOException { Packadg pack = new Packadg(id, name, version, timeout); return pack.snmpGetTable(oid); //return pack.snmpGetNext("1.3.6.1.2.1.1.1"); } }
for(i = 0;i < jList1.getModel().getSize();i++){ if(f[i] % 254 == 0) num = f[i] / 254; else num = (f[i] / 254) + 1; s = f[i]; for(int p = 0;p < num;p++){ if(s - 254 >= 0) numf = 254; else numf = s; for(int k = 0; k < lRead.length;k++){ DefaultListModel lm = (DefaultListModel)jList4.getModel(); ExecutorService exec = Executors.newCachedThreadPool(); ArrayList<Future<String>> results = new ArrayList<Future<String>>(); for(int j = 0;j < numf;j++){ results.add(exec.submit(new ResultScan(lip[i][(254*p)+j], lRead[k], 1, 1000))); } for(Future<String> fs : results) try{ lm.addElement(v + " " + fs.get()); v = v + 1; }catch(InterruptedException e){ System.out.println(e); }catch(ExecutionException e){ System.out.println(e); }finally{ exec.shutdown(); } } s = s - 254; } }