2015-04-09 4 views
1

Проблема кажется простой, у меня есть ряд (огромных) операций, которые мне нужны для работы, и основной поток может продолжаться только тогда, когда все эти операции возвращают свои результаты. Я пробовал только в одном потоке, и каждая операция заняла около двух-десяти секунд, и в конце это заняло около 2,5 минут. Пытались решать будущие задачи и отправили их в Исполнительную службу. Все они обрабатывались одновременно, однако каждый из них занимался, скажем, от 40 до 150 секунд. В конце дня полный процесс занял около 2,1 минуты.Как повысить производительность с помощью FutureTasks

Если я прав, все потоки были всего лишь способом выполнить все сразу, хотя и разделяли мощность процессора, и то, что я думал, что я получу, будет работать с процессором, чтобы заставить меня выполнять все задачи, выполненные на в то же время они берут одно и то же время, которое они берут, чтобы исключить в одном потоке.

Вопрос: есть ли способ, которым я могу достичь этого? (возможно, не с будущими задачами, может быть, с чем-то еще, я не знаю)

Деталь: Мне не нужны они, чтобы точно работать в то же время, что на самом деле для меня не имеет значения, что действительно важно Производительность

ответ

0

Возможно, вы создали слишком много потоков. Как следствие, процессор постоянно переключался между ними, тем самым создавая заметные накладные расходы.

Возможно, вам необходимо ограничить количество выполняемых потоков, а затем вы можете просто отправить свои задачи, которые будут выполняться одновременно.

Что-то вроде:

ExecutorService es = Executors.newFixedThreadPool(8); 
List<Future<?>> futures = new ArrayList<>(runnables.size()); 
for(Runnable r : runnables) { 
    es.submit(r); 
} 
// wait they all finish: 
for(Future<?> f : futures) { 
    f.get(); 
} 
// all done