2014-01-12 3 views
3
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(); 
       ThreadPoolExecutor ex = new ThreadPoolExecutor(1,1, 1L, TimeUnit.MINUTES, queue); 

       final HashMap<String,Response> responses = new HashMap<String,Response>(); 

       ex.execute(new Runnable() { 
        @Override 
        public void run() { 
         android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_MORE_FAVORABLE); 
         Response response = getService().getProducts(); 
         responses.put("1",response); 


        } 
       }); 
.... 
.... 

... 


ex.shutdown(); 
ex.awaitTermination(1000, TimeUnit.DAYS); 
long time2 = System.currentTimeMillis(); 

Я делаю много запросов, по которым я хочу получать уведомление по окончании.ThreadPoolExecutor more threads = slower android

Тестирование на android 2.3 gingerbead на старом устройстве с ThreadPoolExecutor с 1 нить занимает 1-1,2 секунды. Использование 4 потоков занимает больше 4-5 секунд !.

Тестирование на вкладке галактики 3 требуется с одной нитью 100 миллисекунд с 4, она занимает 60 мс.

Почему это происходит?

+0

Обратите внимание, что вместо ручного создания пула потоков вы можете использовать предварительно сконфигурированный метод 'Executors.newXxxxThreadPool'. – assylias

+0

Я знаю, но не пробовал, чтобы иметь конфигурацию. спасибо. – GorillaApe

ответ

5

Независимо от того, сколько потоков вы создаете, у вас есть только столько физических ядер в вашем процессоре.

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

Новое устройство имеет несколько ядер, поэтому они могут распространять потоки поверх них и запускать их параллельно.

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

+0

Причина, по которой я это делал, потому что при использовании удаленного сервера имеет высокую задержку 200 мс. (Ping) Так что для нового устройства, если я сериализую все запросы, которые они добавляют. Но если они работают в потоках, сетевая латентность, кажется, устранена. Однако использование большего количества потоков приводит к нежелательному результату в более старом устройстве. Есть ли решение для этого? Должен ли я создавать потоки в зависимости от какой-либо формулы? – GorillaApe

+1

'Runtime.getRuntime(). AvailableProcessors();' - просто начните, что многие потоки станут достойной отправной точкой. Немного странно, что вы получаете описанное поведение, хотя ожидая ответа сети будет распараллеливаться даже на одном ядре. –

+0

Я знаю его странное не знаю, почему это происходит – GorillaApe

Смежные вопросы