1 // Copyright 2018 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.base.task; 6 7 /** 8 * The {@link TaskExecutor} for ThreadPool tasks. 9 * TODO(crbug.com/1026641): Provide direct Java APIs for ThreadPool vs UI thread 10 * task posting instead of sharding based on {@link TaskTraits}. 11 */ 12 class ThreadPoolTaskExecutor implements TaskExecutor { 13 private static final int TRAITS_COUNT = 14 TaskTraits.THREAD_POOL_TRAITS_END - TaskTraits.THREAD_POOL_TRAITS_START + 1; 15 private final TaskRunner mTraitsToRunnerMap[] = new TaskRunner[TRAITS_COUNT]; 16 ThreadPoolTaskExecutor()17 public ThreadPoolTaskExecutor() { 18 for (int i = 0; i < TRAITS_COUNT; i++) { 19 mTraitsToRunnerMap[i] = createTaskRunner(TaskTraits.THREAD_POOL_TRAITS_START + i); 20 } 21 } 22 23 @Override createTaskRunner(@askTraits int taskTraits)24 public TaskRunner createTaskRunner(@TaskTraits int taskTraits) { 25 return new TaskRunnerImpl(taskTraits); 26 } 27 28 @Override createSequencedTaskRunner(@askTraits int taskTraits)29 public SequencedTaskRunner createSequencedTaskRunner(@TaskTraits int taskTraits) { 30 return new SequencedTaskRunnerImpl(taskTraits); 31 } 32 33 /** 34 * If CurrentThread is not specified, or we are being called from within a threadpool task 35 * this maps to a single thread within the native thread pool. If so we can't run tasks 36 * posted on it until native has started. 37 */ 38 @Override createSingleThreadTaskRunner(@askTraits int taskTraits)39 public SingleThreadTaskRunner createSingleThreadTaskRunner(@TaskTraits int taskTraits) { 40 // Tasks posted via this API will not execute until after native has started. 41 return new SingleThreadTaskRunnerImpl(null, taskTraits); 42 } 43 44 @Override postDelayedTask(@askTraits int taskTraits, Runnable task, long delay)45 public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) { 46 int index = taskTraits - TaskTraits.THREAD_POOL_TRAITS_START; 47 mTraitsToRunnerMap[index].postDelayedTask(task, delay); 48 } 49 50 @Override canRunTaskImmediately(@askTraits int traits)51 public boolean canRunTaskImmediately(@TaskTraits int traits) { 52 return false; 53 } 54 } 55