Android Thread Pool для управления несколькими потоками Bluetooth? - PullRequest
2 голосов
/ 14 марта 2012

Итак, у меня есть Android-приложение Bluetooth, в котором есть хост и клиенты. Проблема в том, что, поскольку я делаю несколько соединений, мне нужен поток для обработки каждого соединения. Это все milk'n'cookies, так что я подумал, что я добавлю все нити в массив. Небольшое исследование говорит, что лучший способ сделать это - использовать Thread Pool, но я не могу понять, как это работает. Кроме того, возможно ли вообще удерживать потоки в массиве?

1 Ответ

2 голосов
/ 14 марта 2012

Пул потоков построен на идее, что, поскольку создание потоков снова и снова занимает много времени, мы должны пытаться перерабатывать их как можно больше.Таким образом, пул потоков - это набор потоков, которые выполняют задания, но не уничтожаются при завершении задания, а вместо этого «возвращаются в пул» и либо выполняют другую работу, либо бездействуют, если делать нечего.

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

В Java пул потоков представлен классом ExecutorService, который может быть:

  • fixed - создать пул потоков с фиксированным числом потоков
  • cached - динамически создаети уничтожает потоки по мере необходимости
  • single - пул с одним потоком

Обратите внимание, что поскольку потоки пула потоков работают описанным выше образом (т.е. перерабатываются), в случаефиксированного пула потоков не рекомендуется иметь задания, которые блокируют операции ввода-вывода, так как потоки, выполняющие эти задания, будут эффективныудаляются из пула до тех пор, пока они не завершат работу, и, таким образом, могут возникнуть взаимоблокировки.

Что касается массива потоков, то это так же просто, как создать любой массив объектов:

Thread[] threads = new Thread[10]; // array of 10 threads
...