1. Старт
Многозадачное параллельное выполнение блокируется и ожидает завершения всех выполнений, а количество параллелизма контролируется через пул потоков. Первая половина — это код (перечисленный в соответствии с потоком выполнения), а вторая половина — соответствующие комментарии.
2. Создайте Callable с возвращаемыми данными
public Callable<String> get(String key, Map<String, Object> params) {
return () -> {
System.out.println("开始查询=======" + params.toString());
Thread.sleep(500);
long currentTimeMillis1 = System.currentTimeMillis();
System.out.println("get任务耗时:" + (currentTimeMillis1 - currentTimeMillis) + "ms");
return key + "哈哈哈哈哈哈";
};
}
3. Создайте циклический вызовCallable<String>
List<Callable<String>> tasks = new ArrayList<>();
for (int i = 0; i < 30; i++) {
// ... params
Callable<String> callable = mSmsStatisticsService.get(i + "key", params);
tasks.add(callable);
}
В-четвертых, создайте пул потоков
/**
* corePoolSize:核心线程数。
* maximumPoolSize:线程池允许创建的最大线程数。
* keepAliveTime:非核心线程闲置的超时时间。超过这个时间则回收。
* TimeUnit:keepAliveTime参数的时间单位。
* workQueue:任务队列。
* ThreadFactory:线程工厂,用于创建线程。
* RejectedExecutionHandler:饱和策略。
*
* ThreadPoolExecutor(int corePoolSize,
* int maximumPoolSize,
* long keepAliveTime,
* TimeUnit unit,
* BlockingQueue<Runnable> workQueue,
* ThreadFactory threadFactory,
* RejectedExecutionHandler handler)
*/
ExecutorService executorService = new ThreadPoolExecutor(5, 32,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(1024),
r -> {
Thread thread = new Thread(r);
// thread.setName("sdwfqin");
return thread;
}, new ThreadPoolExecutor.AbortPolicy());
Пятое, запускайте нити и получить данные возврата
List<String> resultList = new ArrayList<>();
// 启动线程并获取返回数据
List<Future<String>> futures = executorService.invokeAll(tasks);
for (Future<String> future : futures) {
resultList.add(future.get());
}
Шестой, закрыть пул резьбы
executorService.shutdown();
7. Вышеупомянутые пояснения, связанные с API
-
ExecutorService
-
основной метод
- представить: отправлено
Callable
метод, возвращаетFuture
, указывая, что submit имеет возвращаемое значение - Выполнить: execute
Runnable
метод без возвращаемого значения - invokeAny: получает
Callable
Коллекция объектов в качестве параметра. Вызов этого метода не возвращаетFuture
объект, но возвращает одну из коллекцийCallable
объект, и нет гарантии, что результат, возвращаемый после вызова, являетсяCallable
, просто знай, что это ониCallable
одна из казней заканчиваетсяCallable
объект. - invokeAll: вызывает все существующие в наборе параметров
Callable
объект и возвращает коллекцию, содержащую объекты Future, которые можно использовать для управления каждымCallable
результат исполнения. - выключение: изящное выключение
ExecutorService
, когда этот метод вызывается,ExecutorService
Прекратите получать новые задачи и дождитесь завершения уже отправленных задач (как отправленных, так и незавершенных). Когда все отправленные задачи выполнены, пул потоков закрывается.
- представить: отправлено
-
политика отказа
- ThreadPoolExecutor.AbortPolicy: прервать задачу и бросить
RejectedExecutionException
аномальный. - ThreadPoolExecutor.DiscardPolicy: также отбрасывает задачи, но не генерирует исключения.
- ThreadPoolExecutor.DiscardOldestPolicy: отменить задачу в начале очереди и выполнить следующие задачи.
- ThreadPoolExecutor.CallerRunsPolicy: задача обрабатывается вызывающим потоком.
- ThreadPoolExecutor.AbortPolicy: прервать задачу и бросить
-
очередь блокировки
- ArrayBlockingQueue: очередь FIFO на основе массива, ограниченная
- LinkedBlockingQueue: очередь FIFO на основе связанного списка, неограниченная
- SynchronousQueue: небуферизованная очередь ожидания, неограниченная
- что не ограничено: если емкость не указана, по умолчанию
Integer.MAX_VALUE
-
Общий пул потоков
- Executors.newcachedThreadPool (): можно кэшировать пул резьбы
- Executors.newSingleThreadExecutor(): пул с одним потоком
- Executors.newFixedThreadPool(3): пул потоков с фиксированным номером потока.
- Executors.newScheduledThreadPool(5): фиксированное количество потоков, поддерживает временные и периодические задачи.
- ThreadPoolExecutor(): создан вручную
-
-
Future
-
основной метод
- get: Когда задача завершается, она возвращает результат.Если работа не завершена на момент ее вызова, поток будет заблокирован до тех пор, пока задача не будет выполнена.
- Получить (давние тайм-аут, Timeunit): результат будет возвращен после ожидания наибольшего времени ожидания
- cancel(boolean mayInterruptIfRunning): может использоваться для остановки задачи, если задача может быть остановлена (через
mayInterruptIfRunning
Чтобы судить) можно вернуть true, если задача была завершена или остановлена, или задачу нельзя остановить, она вернет false. - isDone(): определяет, завершен ли текущий метод.
- isCancel(): определить, отменен ли текущий метод
-