¿Se asignan automáticamente nuevos subprocesos a un núcleo de CPU diferente en Java?

En Java, y más específicamente, Android, ¿son nuevos Temas automáticamente asignados a un núcleo de CPU diferente del que estoy utilizando actualmente, o debería ocuparme de eso?

Además, ¿importa cómo se crea el nuevo subproceso, utilizando la clase Thread o enviando un Runnable a un Executor, que mantiene un grupo de subprocesos?

Hay una pregunta similar aquí, pero la respuesta sigue explicando cómo el OP debe abordar su problema particular, en lugar de bucear en el caso más general: ¿ Hilos que utilizan automáticamente múltiples núcleos de la CPU?

En Java, y más específicamente, Android, ¿son nuevos Temas automáticamente asignados a un núcleo de CPU diferente del que estoy utilizando actualmente, o debería ocuparme de eso?

La decisión de qué hilos funcionan en qué núcleos es manejado por el OS sí mismo (en Android, basado apagado del programador de Linux). Usted no puede afectar esas decisiones usted mismo; Las decisiones son automáticas y dinámicas.

¿Importa cómo se crea el nuevo subproceso, utilizando la clase Thread o enviando un Runnable a un Executor, que mantiene un grupo de subprocesos?

Con respecto a los núcleos en los que se ejecuta un subproceso, el SO no conoce ni se preocupa si un Executor está involucrado, o incluso si el lenguaje de programación en el que se escribió la aplicación tiene algo llamado Executor .

En Java, y más específicamente, Android, ¿son nuevos Temas automáticamente asignados a un núcleo de CPU diferente del que estoy utilizando actualmente, o debería ocuparme de eso?

En Java los hilos de rosca son secuencia simplemente separada de ejecuciones, pero en androide es un poco más complicado que eso. Android crea un hilo principal por aplicación. Este hilo principal es responsable de la interfaz de usuario y otras tareas relacionadas con los eventos (cola). Para hacer el trabajo de fondo tiene que crear hilos de trabajo separados.

Los subprocesos simples son manejados automáticamente por el sistema operativo Android y pueden o no ejecutarse en núcleos separados . Si usted está ejecutando 10 hilos, es muy posible que todos se ejecutan en un núcleo dejando todos los demás núcleos inactivo.

Si necesita ejecutar más de un subproceso y desea ejecutar cada subproceso en un núcleo independiente , debe utilizar ThreadPoolExecutor ; Manejará la creación del hilo y la asignará en el número de núcleos de la CPU disponibles. Usted puede fijar varios parámetros según su requisito. Mira lo que Android está diciendo:

Un ThreadPoolExecutor ajustará automáticamente el tamaño del conjunto (ver getPoolSize ()) de acuerdo con los límites establecidos por corePoolSize (véase getCorePoolSize ()) y maximumPoolSize (véase getMaximumPoolSize ()). Cuando se envía una nueva tarea en el método ejecutar (Runnable) y se ejecutan menos de los subprocesos corePoolSize, se crea un nuevo subproceso para controlar la solicitud, incluso si otros subprocesos de trabajo están inactivos. Si hay más de corePoolSize pero menos de threads maximumPoolSize en ejecución, se creará un nuevo subproceso solo si la cola está llena.

Vea ThreadPoolExecutor para más detalles.

¿Importa cómo se crea el nuevo subproceso, utilizando la clase Thread o enviando un Runnable a un Executor, que mantiene un grupo de subprocesos?

Sí, vea la respuesta anterior.

Actualizar

Diciendo que "para ejecutar cada hilo en un núcleo separado utilizar ThreadPoolExecutor", quería decir que ThreadPoolExecutor puede hacer eso si se utiliza correctamente de una manera cuidadosa.

Java no asigna roscas directamente en la CPU. Java deja el cronograma de los hilos (mediante la asignación a los procesos del sistema operativo) en el sistema operativo, pero la forma en que creamos hilos influye en la programación a nivel del sistema operativo . Sin embargo, Java, puede asignar prioridad a los subprocesos, pero de nuevo depende del sistema operativo cumplir estas prioridades.

Hay varios parámetros que debemos considerar al crear un grupo de subprocesos, pocos son los siguientes:

I) Los hilos deben ser iguales en complejidad.

Ii) Comparación de las tareas vinculadas a la CPU con I / O obligado, tareas de enlace de E / S por lo general necesitan más hilos que el núcleo disponible para una utilización óptima de la CPU

Iii) Dependencia entre hilos efecto negativo

Si se crean subprocesos teniendo en cuenta estos puntos, ThreadPoolExecutor puede ayudar a lograr un 100% de la utilización de la CPU, es decir, un hilo por núcleo (si el tamaño del grupo de hilos es igual al número de núcleos y ningún otro hilo está en ejecución). Un beneficio de ThreadPoolExecutor es que es rentable como comparar a la creación de hilos por separado y también elimina el cambio de contexto que desperdicia una gran cantidad de ciclos de CPU.

Lograr el 100% de la utilización de la CPU mientras se hacen las cosas simultáneas, no es una tarea fácil.

  • Los animadores sólo se pueden ejecutar en los subprocesos Looper en Sherlock Action Bar
  • RxAndroid: cambios de interfaz de usuario en el subproceso Schedulers.io ()
  • La mejor práctica para manejar el cambio de orientación: Android
  • ¿Cuál es el mecanismo detrás de startActivityForResult () en Android?
  • ¿Puede alguien ayudarme a entender el enhebrado de mi programa?
  • NDK / JNI: identificando el hilo actual
  • Notificando un solo hilo: notify, notifyAll o concurrent.locks.Condition?
  • Llamar a un AsyncTask de otro AsyncTask
  • ¿Es legal llamar al método de inicio dos veces en el mismo hilo?
  • ¿Los hilos se eliminan automáticamente después de que el método run () sale en Java?
  • Obtener hilo por nombre
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.