Вы модифицируете исходный массив records
в методе nameSearchFilter
. Это неверно. Вам необходимо создать массив recordsToDisplay
и использовать его для рисования строк таблицы и назначения результатов фильтрации в нем.
Я думаю, что документация довольно хорошо объясняет разницу и использование этих двух функций:
Создает пул потоков, который повторно использует фиксированное количество отключенных потоков общая неограниченная очередь. В любом точки, не более nThreads потоков будут быть активными задачами обработки. Если дополнительные задачи отправляются, когда все потоки активны, они будут ждать в очереди, пока поток не будет доступный. Если какой-либо поток завершается из-за сбоя при исполнении до выключения новый примет его место, если необходимо выполнить последующие задачи. Темы в пул будет существовать, пока он не будет явно неисправность.
Создает пул потоков, который создает новые потоки по мере необходимости, но будут повторно использовать ранее созданные потоки, когда они доступны. Эти пулы будут обычно улучшают производительность программы, которые выполняют многие недолговечные асинхронные задачи. Призывы к исполнению будет повторно использовать ранее построенные темы, если есть. Если не существует поток доступен, новый поток будет быть создан и добавлен в пул. Потоки, которые не использовались для шестьдесят секунд прекращаются и удален из кеша. Таким образом, пул что остается без дела достаточно долго будет не потребляют никаких ресурсов. Обратите внимание, что бассейны с аналогичными свойствами, но разные детали (например, параметры тайм-аута) могут быть созданы с использованием конструкторов ThreadPoolExecutor.
Что касается ресурсов, newFixedThreadPool
будет поддерживать работу всех потоков до тех пор, пока они не будут явно завершены. В newCachedThreadPool
потоки, которые не использовались в течение шестидесяти секунд, завершаются и удаляются из кеша.
Учитывая это, потребление ресурсов будет во многом зависеть от ситуации. Например, если у вас огромное количество длительно выполняемых задач, я бы предложил FixedThreadPool
. Что касается CachedThreadPool
, в документации говорится, что «Эти пулы обычно улучшают производительность программ, которые выполняют множество краткосрочных асинхронных задач».
ThreadPoolExecutor
класс является базовым внедрением для исполнителей, которые возвращаются из многих из эти Executors
методы фабрики. Поэтому давайте приблизимся Зафиксированный и Кэшируемый пулы потоков от ThreadPoolExecutor
перспектива.
основной конструктор из этого класса похож на это:
public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler
)
Эти corePoolSize
определяет минимальный размер целевого пула потоков. реализация поддержала бы пул того размера, даже при отсутствии задач выполниться.
Эти maximumPoolSize
является максимальным количеством потоков, которые могут быть активными сразу.
После того, как пул потоков растет и становится больше, чем corePoolSize
порог, исполнитель может завершить неактивные потоки и достигнуть к corePoolSize
снова. Если allowCoreThreadTimeOut
верно, то исполнитель может даже завершить базовые потоки пула, если они были неактивны больше чем [1 112] порог.
, Таким образом, нижняя строка - то, если потоки остаются неактивными больше чем [1 113] порог, они могут быть завершены, так как нет никакого спроса на них.
, Что происходит, когда новая задача входит и все базовые потоки занята? новые задачи будут поставлены в очередь в том BlockingQueue<Runnable>
экземпляр. Когда поток становится свободным, одна из тех задач с очередями может быть обработана.
существуют различные реализации эти BlockingQueue
интерфейс в Java, таким образом, мы можем реализовать различные подходы организации очередей как:
Ограниченная Очередь : Новые задачи были бы поставлены в очередь в ограниченной очереди задачи.
Неограниченная Очередь : Новые задачи были бы поставлены в очередь в неограниченной очереди задачи. Таким образом, эта очередь может вырасти так, как размер "кучи" позволяет.
Синхронная Передача : Мы можем также использовать SynchronousQueue
для организации очередей новых задач. В этом случае, при организации очередей новой задачи, другой поток должен уже ожидать той задачи.
Вот состоит в том, как эти ThreadPoolExecutor
выполняет новую задачу:
BlockingQueue#offer
метод. offer
метод не заблокируется, если очередь будет полна и сразу возвратится false
. offer
возвраты false
), затем это пытается добавить новый поток к пулу потоков с этой задачей как ее первое задание. RejectedExecutionHandler
. основное различие между фиксированными и кэшируемыми пулами потоков сводится к этим трем факторам:
+-----------+-----------+-------------------+---------------------------------+ | Pool Type | Core Size | Maximum Size | Queuing Strategy | +-----------+-----------+-------------------+---------------------------------+ | Fixed | n (fixed) | n (fixed) | Unbounded `LinkedBlockingQueue` | +-----------+-----------+-------------------+---------------------------------+ | Cached | 0 | Integer.MAX_VALUE | `SynchronousQueue` | +-----------+-----------+-------------------+---------------------------------+
<час>
<час> Здесь то, как
Excutors.newFixedThreadPool(n)
работы: public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
, Как Вы видите:
OutOfMemoryError
. , Когда я должен использовать один или другой? Какая стратегия лучше с точки зрения использования ресурса?
пул потоков фиксированного размера А, кажется, хороший кандидат, когда мы собираемся ограничить количество параллельных задач в целях управления ресурсами .
, Например, если мы собираемся использовать исполнителя для обрабатывания запросов веб-сервера, фиксированный исполнитель может обработать пакеты запроса более обоснованно.
Для еще лучшего управления ресурсами, это настоятельно рекомендовано для создания пользовательского ThreadPoolExecutor
с ограниченным BlockingQueue<T>
реализация вместе с разумным RejectedExecutionHandler
.
<час>
Вот то, как Executors.newCachedThreadPool()
работы:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
, Как Вы видите:
SynchronousQueue
всегда сбои, когда нет никого на другом конце для принятия его! , Когда я должен использовать один или другой? Какая стратегия лучше с точки зрения использования ресурса?
Использование это, когда у Вас есть много предсказуемых коротких выполняющихся задач.