Concurrencia en Android LSUB, GYSC, URJC



Documentos relacionados
Concurrencia en Android LSUB, GYSC, URJC

Multitarea en Java. Rafa Caballero - UCM

Programación Concurrente en Java

Federico Peinado

1 HILOS (THREADS) EN JAVA

Programación Orientada a Eventos

Threads LSUB. 30 de marzo de 2016 GSYC

PROGRAMACIÓN EN JAVA

TEMA 5: Control de la Concurrencia en Java (API Estándar)

(THREADS) Ing. Laura Sandoval Montaño, Ing. Manuel Enrique Castañeda Castañeda PAPIME

Benemérita Universidad Autónoma del Estado de Puebla

Hebras y Sincronización en Java

Java nos ofrece la clase Thread y la interfaz Runable que permiten que varios procesos estén funcionando de forma concurrente.

Ejercicios - Servicios

Object 1. Threads en Java

Threads. La plataforma JAVA soporta programas multhreading a través del lenguaje, de librerías y del sistema de ejecución. Dos.

Parsear HTML con htmlparser para Android Guillem Pérez

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Monitores Ing. Iván Medrano Valencia

MONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar

void main(void) { string lname; list <string> lnamelist; cout << "Please enter your list of last names finishing with `.`"<<endl;

Multitarea En Swing. Varios hilos trabajadores, también conocidos como hilos en segundo plano.

Java y JVM: programación concurrente

Concurrencia en Java

Benemérita Universidad Autónoma del Estado de Puebla

Repaso de las características más importantes de la programación Java y su adaptación a Android

dit UPM Tema 3: Concurrencia /ejercicios Análisis y diseño de software José A. Mañas

Java: Programación Multithread

Desarrollo de Aplicaciones para Android

Hilos en Java. Crear un Hilo. Detener un hilo. Fuente:

75-62 Técnicas de Programación Concurrente II 2004 java Threads

Servicios - Ejercicios

SOLUCION PARCIAL TASK SCHEDULER. Task Scheduler

Programación Orientada a Objetos con Java

Programación concurrente

La funcionalidad básica es la del proyecto 1 (Pacman III). Sobre ella reemplazamos la interfaz de usuario para adaptarla al nuevo entorno

MODELO DE IMPLEMENTACIÓN

Si bien Pascal-FC no trae algunas de las características de Pascal como:

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

Concurrencia. Primitivas IPC con bloqueo

Introducción a los Threads Java

Tareas en segundo plano AsyncTask Thread

Introducción a Java LSUB. 15 de enero de 2015 GSYC

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Concurrencia en Java

1 (2 5 puntos) Responda con brevedad y precisión a las siguientes preguntas:

Programación concurrente en Java. Breve introducción. Miguel Ángel LATRE Dept. de Informática e Ingeniería de Sistemas

CDI Exclusión mutua a nivel alto. conceptos

Programación Concurrente en Java

Introducción a la Programación Orientada a Objetos

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

Programación Orientada a Objetos en Java

2.2.- Paradigmas de la POO

Modulo 1 El lenguaje Java

Programación Orientada a Objetos en Java

Hilos. Índice. Copyright Dept. Ciencia de la Computación e IA All rights reserved.

3.9 Patrón Distributed callback

Ejercicios - Persistencia en Android: proveedores de contenidos y SharedPreferences

Ejercicio 1 (3 puntos).-

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

Servidores Web (II) Contenidos

Capitulo 4: Componentes Android

Segunda práctica de Programación 2

Solución al Examen de Prácticas de Programación (Ingeniería Informática)

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

Dropbox. Parte 2. Práctica 02-ud03 15/01/2013 Pág. 1 de 6

Programación orientada a objetos

Programación concurrente en Java

Introducción a la programación orientada a objetos

Tema 2. El lenguaje de programación Java (Parte 1)

Java RMI. las RPC de Java. Parte I. Luis Fernando Llana Díaz. Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid

MARTIN JARAMILLO PINO Proyecto Final Programación, creatividad y solución de problemas con Scratch

Secretos de la Programación Concurrente

Ejecución de hebras. En realidad, todas las aplicaciones escritas en Java son aplicaciones multihebra (recuerde el recolector de basura).

Pruebas de unidad con JUnit

Java RMI. Sistemas Distribuidos Rodrigo Santamaría

Sistemas Operativos. Curso 2016 Procesos

Instalación Tacotel Lector Documentación Sistemas

Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía.

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

Carmen. Estándares de codificación. Manuel Arias Calleja

Modelo de Objetos Distribuidos

Programación Concurrente. Curso Java 2012, 2013 Juan Manuel Fernández Peña

Guillermo Román Díez

Curso de Java POO: Programación orientada a objetos

1. Instalación Entrenamiento Entrenamiento del ruido ambiente Entrenamiento de tus sonidos de interés...

Tema 4. Gestión de entrada/salida

Curso Introducción JAVA Pág.: 1

15. Parámetros o argumentos

GUIA PROGRAMACIÓN ORIENTADA A OBJETOS

Agentes con Interfaz Gráfica.

Q-flow Patrones básicos de Workflow

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Sistemas Operativos Práctica 4

Índice ÍNDICE EJERCICIO 1: CÁLCULO FINANCIERO (5 PTOS.) EJERCICIO 2: AGENCIA DE COLOCACIONES (5 PTOS.)...4

PHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases

Android Creación de una aplicación sencilla: Forwarding - Página 1 -

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Servicios LSUB, GYSC, URJC

Transcripción:

Concurrencia en Android LSUB, GYSC, URJC

Repaso de concurrencia en Java

Crear un thread Instanciar un Thread, con el método run sobreescrito Intanciar un objeto que cumpla el interfaz Runnable y pasárselo al constructor de Thread! interface Runnable { ; void run();

Ejecutar un Thread Llamar al método start El método principal del hilo se llama run

Implementando Runnable! public class Biteme implements Runnable {! @Override public void run() { //Ejecuta en paralelo! Puedo crear todos los threads que quiera t = new Thread(new Biteme()); t.start(); b = new Thread(new Biteme()); b.start();

Heredando de Thread! public class Biteme extends Thread {! @Override public void run() { //Ejecuta en paralelo! t = new Biteme(); t.start(); b = new Biteme(); b.start(); Y se crean

Heredando de Thread clase interna! public class Cup { public int level; private class Biteme extends Thread { @Override public void run() { //Ejecuta en paralelo, tiene acceso a Cup level = 3; public void fill() { Biteme b = new Biteme(); b.start();

Heredando de Thread clase interna anónima public class Cup { public int level; public void fill() { Thread b = new Thread(){ @Override public void run() { level = 3; ; b.start();

Thread Thread, metodos de clase interesantes: currentthread(): referencia al thread actual activecount(): numero de threads activos dumpstack(): pila en stderr sleep(int ms) yield(): cede el cuanto

Executor java.util.concurrent Interfaz para ejecutar objetos de tipo Runnable Puede hacerlo en serie, en paralelo, con unos cuantos threads, etc.! interface Executor { public void execute(runnable r); ;

Executor: ejemplo de uso! SerialExecutor s = new SerialExecutor(); BiteMe b = new BiteMe(); //Runnable s.execute(b); s.execute(b);

ExecutorService Es un interfaz que hereda de Executor Con extras para controlar el progreso Future<?> submit(runnable task) Future tiene un método get() que devuelve null si ha acabado y otra cosa si no Future tiene más métodos para controlar el progreso y cancelar

ExecutorService!! ExecutorService es = Executors.newFixedThreadPool(3); BiteMe b = new BiteMe(); //Runnable BiteMe bx = new BiteMe(); //Runnable Future<?> fut1 = es.submit(b); Future<?> fut2 = es.submit(bx); try{ if(fut1.get() == null){ System.out.println("b ha acabado bien"); if(fut2.get() == null){ System.out.println("bx ha acabado bien"); catch(executionexception e){ //ha fallado la ejecucion catch(interruptedexception e){ //se ha interrumpido finally{ es.shutdown(); //acabo con el executor service

Interrupciones Son mala idea como método de comunicación Mejor comunicarse con variables y que el thread salga o haga lo que sea el mismo Pueden ser necesarios si tengo un thread en sleep Recoger InterruptedException

Condiciones de carrera Si tengo varios hilos, puedo tener condiciones de carrera Ojo con tocar datos compartidos sin protección!!!

Sincronización Puedo esperar que un thread acabe llamando a su método join() puedo poner timeout! t.start(); t.join(); //me quedo bloqueado hasta que acabe

Sincronización Puedo esperar que todos los threads de un executor service acaben, tiene timeout: awaittermination() Antes tengo que haber llamado a shutdown(), ya no admitas más threads, ve saliendo! e.awaittermination(3, TimeUnit.SECONDS);

Sincronización: synchronized Hay un cierre reentrante asociado a los objetos (un objeto es un monitor) Se coge (se entra al monitor) llamando a un método synchronized o rodeando un bloque con synchronized

Sincronización: synchronized public class Cup { public synchronized void fill() { //Estoy en el monitor de esta instancia de Cup public void fill2() { BiteMe b = new BiteMe(); synchronized(b){ //Estoy en el monitor b

Sincronización: synchronized public class Cup { public synchronized void fill() { //Estoy en el monitor de esta instancia de Cup public void fill2() { synchronized(this){ //Estoy en el monitor de esta instancia de Cup

Sincronización: synchronized Ojo, los métodos estáticos cogen el cierre de la clase public class Cup { public static synchronized void fill3() { //Estoy en el monitor de la clase Cup

Sincronización: synchronized public class Cup { public synchronized void fill() { //Estoy en el monitor de esta instancia de Cup public synchronized void fill2() { fill(); //No hay deadlock, es un monitor

Sincronización: comunicación BlockingQueue: FIFOs bloqueantes, como canales ConcurrentMap: Diccionario (nombrevalor) con operaciones atómicas

Sincronización Decorador sincronizado para colecciones (hay otros especializados): public static <T> Collection<T> synchronizedcollection(collection<t> c) Ojo, hay que sincronizar el acceso! Collection c = Collections.synchronizedCollection(myCollection);... synchronized(c) { Iterator i = c.iterator(); // Ojo, dentro de un bloque synchronized while (i.hasnext()) foo(i.next());

Concurrencia en Android

Problemas GUI no responde: las callbacks no pueden estar mucho rato bloqueadas; usar threads Threads en background no pueden modificar la GUI

Alternativas Crear threads, esperar a que acaben, actualizar la GUI, join() o awaittermination() Usar View.post para actualizar la GUI Usar AsyncTask, divide tareas entre threads en background y threads de GUI No actualizo la GUI si no estoy en el hilo principal!!!

View.post Tengo un hilo que he creado corriendo en background Quiero que cambie la UI Por ejemplo una barra de progreso Uso el método post para pasarle un Runnable que ejecutará el hilo asociado al View

Ejemplo: Botón para un tono: public class Tono implements OnClickListener { View but; void playsound(){ //suena Tono(View v) { but = v; //inicializo el tono private class Pressme implements Runnable { boolean p; View v; Pressme(View b, boolean pressed){ p = pressed; v = b; @Override public void run() { v.setenabled(!p);

Ejemplo: Botón para un tono:! @Override public void onclick(view arg0) { arg0.setenabled(false); Thread t = new Thread(){ public void run(){ playsound(); try{ Thread.sleep(3*1000); catch(interruptedexception e){ but.post(new Pressme(but, false)); ; t.start();

Ejemplo: OJO El hilo tiene una referencia al botón Que vive en la Activity Qué sucede si la Activity se recrea? Por ejemplo, si giran la pantalla OJO: las Activities son volátiles!!!

AsyncTask Crea un hilo cuando se llama al método execute() Ejecuta algunos métodos en el contexto de ese hilo Y otros en el contexto de la GUI (son callbacks), en particular de una View

AsyncTask private class SomeTask extends AsyncTask<Type1, Type2, Type3> { public Type3 doinbackground(type1... params) { return(dononuistuffwith(params)); public void onpostexecute(type2 result) { douistuff(result); new SomeTask().execute(type1VarA, type1varb);!

AsyncTask Los tres parámetros del tipo genérico: AsyncTask<Type1, Type2, Type3> Type1 Parámetros de doinbackground(type1...) Type 2 registro de progreso onprogressupdate(type2...) Type 3 resultado de Type3 doinbackground(type1...)

AsyncTask doinbackground() ejecuta en un hilo en background onpreexecute() onpostexecute() ejecutan en GUI antes y después del hilo onprogressupdate() lo ejecuta el GUI, cuando se ha llamado a publishprogress() El argumento de onprogressupdate() es lo que sea que se le pasó a publishprogress()