La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Curso de Java y Aplicaciones Web

Presentaciones similares


Presentación del tema: "Curso de Java y Aplicaciones Web"— Transcripción de la presentación:

1 Curso de Java y Aplicaciones Web
Multi-threaded y manejo de archivos Facultad Politécnica – U.N.A. Ing. Esteban Ramírez

2 Objetivos Curso de Java y Aplicaciones Web Threads Archivos Reflexion

3 Java multihilos Curso de Java y Aplicaciones Web La Máquina Virtual Java (JVM) es un sistema multihilo. Es decir, es capaz de ejecutar varios hilos de ejecución simultáneamente. La JVM gestiona todos los detalles, asignación de tiempos de ejecución, prioridades, etc., de forma similar a como gestiona un Sistema Operativo múltiples procesos. Desde el punto de vista de las aplicaciones los hilos son útiles porque permiten que el flujo del programa sea divido en dos o más partes, cada una ocupándose de alguna tarea de forma independiente.

4 QUÉ ES UN THREAD Curso de Java y Aplicaciones Web

5 QUÉ ES UN THREAD Curso de Java y Aplicaciones Web La clase Thread está en el paquete java.lang. Por tanto, no es necesario el import. • El constructor public Thread(String str) recibe un parámetro que es la identificación del Thread. • El método run() contiene el bloque de ejecución del Thread. Dentro de él, el método getName() devuelve el nombre del Thread (el que se ha pasado como argumento al constructor). • El método main crea dos objetos de clase ThreadEjemplo y los inicia con la llamada al método start() (el cual inicia el nuevo hilo y llama al método run()). • La ejecución de los hilos es asíncrona. Realizada la llamada al método start(), éste le devuelve control y continua su ejecución, independiente de los otros hilos.

6 THREAD live cycle Curso de Java y Aplicaciones Web

7 La interface runnable Curso de Java y Aplicaciones Web

8 Finalización de un Hilo
Un flujo principal de un programa acaba cuando termina el método main. Un hilo acaba cuando finaliza el método run() normal o por una excepción no capturada. A veces es necesario detener un hilo, pero debido a cuestiones de concurrencia la detención debe ser ordenada: Interrupción hilo.interrupt(); El hilo debe controlar cuando se solicita su interrupción: if (Thread.interrupted()) ... Consideraciones método interrupted(): El método interrupted es de clase para poder llamarlo desde una clase que no herede de Thread. La llamada al método resetea un flag de interrupción. Alternativa: Thread.currentThread().isInterrupted(); public void run(){ .. while (no me pidan que interrumpa && tenga trabajo por hacer){ //trabajar } //termina el método run y por tanto el hilo de ejecución o bien try{ while (!interrupted() && tenga trabajo por hacer){ }catch (InterruptedException e){ //thread was interrupted during sleep or wait

9 Método sleep El metodo sleep detiene la ejecucion del hilo de forma momentanea (libera procesador). Thread.sleep(1000); Si se interrumpe un hilo durante el sueño (sleep) el método sleep lanza la excepción InterruptedException while (true) { try { System.out.println(“hola”); } catch (InterruptedException e) { ...} } Cuando un hilo es interrumpido durante el sueño no queda activado el flag de interrupción (!!)

10 Sincronización Varios hilos accediendo a los mismos datos pueden
dar lugar a inconsistencias. Ejemplo: clase Punto método incX() x = x + 1; Hay que contemplar la posibilidad de que un método sea ejecutado concurrentemente y protegerlo: (esquema a priori) public synchronized void incX() { ... } La llamada al método bloquea al hilo si hay otro ejecutando esa operación sobre el mismo objeto. Si la clase no está protegida, los hilos deben evitar los problemas de concurrencia poniendo un candado sobre el objeto: (esquema a posteriori) synchronized(pto) { pto.incX(); ... } Etiquetar cualquier operación que no debe ser interrumpida con synchronized

11 Clase Thread Métodos de control: Modificación :
Curso de Java y Aplicaciones Web Métodos de control: Crear un thread (constructor Thread). Iniciar la ejecución (start). Detener la ejecución (suspend, interrupt, stop, sleep). Reanudar la ejecución (resume). Ceder el procesador (yield). Esperar la terminación de otro thread (join). Modificación : Nombre (getName / setName). Prioridad (getPriority / setPriority): MIN_PRIORITY (1). NORM_PRIORITY (5), MAX_PRIORITY (10). Grupo de hilos (getThreadGroup): Cada thread pertenece a un grupo. Daemon (isDaemon / setDaemon): Indica si el thread es daemon o no.

12 Comunicación entre Hilos
Curso de Java y Aplicaciones Web synchronized permite el bloqueo entre hilos, pero también ha de haber comunicación entre ellos. wait(): deja al hilo esperando por una condición, liberando el bloqueo sobre el objeto (op. atómica) synchronized void siCondicion(){ while (!condicion) wait(); // hacer cuando se cumpla la condicion ... } siempre en un bucle

13 Comunicación entre Hilos
Curso de Java y Aplicaciones Web notify(), notifyAll(): indican a los hilos en espera que la condición puede haberse cumplido synchronized void cambiarCondicion(){ // se altera algún valor de la condición notifyAll(); // o notify(); } notifyAll() despierta a todos los hilos esperando, notify() selecciona sólo a uno para ser despertado Todos los hilos esperan por la misma condición. Sólo un hilo como mucho se deberia beneficiar.

14 Cuestiones avanzadas y Conclusiones
Grupos de hilos. Prioridades. Estrategias de sincronización Consejos: Programar hilos puede ser un perjuicio más que un beneficio. Hay que utilizar los hilos con sensatez

15 Practica de hilos Curso de Java y Aplicaciones Web Crear un Threads que en su constructor reciba un String y en su método run imprima este String cada 1 segundo. Instanciar tres objetos de la clase anterior con una cadena diferente en cada uno, ejecutar los tres hilos de forma concurrente.

16 Practica de hilos Curso de Java y Aplicaciones Web

17 Practica de hilos Curso de Java y Aplicaciones Web

18 Manejo de archivos Curso de Java y Aplicaciones Web La forma de interactuar con los sistemas de archivos locales se realiza a través de la clase File, esta clase proporciona muchas utilidades relacionadas con archivos y con la obtención de información básica sobre esos archivos.

19 Creación de un objeto File
Curso de Java y Aplicaciones Web Para crear un objeto File nuevo, se puede utilizar cualquiera de los constructores siguientes: File miArchivo = new File( "path/mi_archivo" ); File miArchivo = new File( "path","mi_archivo" ); File miDirectorio = new File( "path" ); miArchivo = new File( miDirectorio,"mi_archivo" ); Company Logo

20 Comprobaciones y Utilidades
Curso de Java y Aplicaciones Web Una vez creado un objeto File, se puede utilizar uno de los siguientes métodos para reunir información sobre el archivo: Nombres de archivo: String getName() String getPath() String getAbsolutePath() String getParent() boolean renameTo( File nuevoNombre ) Comprobaciones: boolean exists() boolean canWrite() boolean canRead() boolean isFile() boolean isDirectory() Información general del archivo: long lastModified() long length() Utilidades de directorio: boolean mkdir() String[] list()

21 Comprobaciones y Utilidades
Curso de Java y Aplicaciones Web Hay muchas clases dedicadas a la obtención de entrada desde un archivo. Este es el esquema de la jerarquía de clases de entrada por archivo: Un stream de datos es un flujo de bytes continuo extraido de una fuente (Archivo, teclado, etc.).

22 Objetos FileInputStream
Curso de Java y Aplicaciones Web File miArchivo; FileInputStream miArchivoSt; miArchivo = new File( "/etc/kk" ); miArchivoSt = new FileInputStream( miArchivo ); Una vez abierto el FileInputStream, se puede leer de él. El método read() tiene muchas opciones: int read(); //Lee un byte y devuelve -1 al final del stream. int read( byte b[] ); //Llena todo el array, si es posible. int read( byte b[],int offset,int longitud ); //Lee longitud bytes en b comenzando por b[offset]. Cuando se termina con un archivo, existen dos opciones para cerrarlo: explícitamente, o implícitamente cuando se recicla el objeto (el garbage collector se encarga de ello). Para cerrarlo explícitamente, se utiliza el método close().

23 Objetos DataInputStream
Curso de Java y Aplicaciones Web Los streams de datos pueden leer cualquiera de las variables de tipo nativo, como floats, ints o chars. Generalmente se utilizan DataInputStream con archivos binarios. Al acceder a un archivo con DataInputStream, se pueden utilizar los mismos métodos read() de los objetos FileInputStream. No obstante, también se tiene acceso a otros métodos diseñados para leer cada uno de los tipos de datos: byte readByte(); int readUnsignedByte(); short readShort(); int readUnsignedShort(); char readChar(); int readInt(); long readLong(); float readFloat(); double readDouble(); String readLine() Para el método String readLine(), se marca el final de la cadena con \n, \r, \r\n o con EOF.

24 Streams de salida Curso de Java y Aplicaciones Web Como con los Streams de entrada, las clases de salida están ordenadas jerárquicamente:

25 Objetos FileOutputStream
Curso de Java y Aplicaciones Web Los objetos FileOutputStream son útiles para la escritura de archivos de texto. Como con los archivos de entrada, primero se necesita abrir el archivo para luego escribir en él.

26 Escritura DataOutputStream
Curso de Java y Aplicaciones Web Cada uno de los métodos write() accesibles por los FileOutputStream también lo son a través de los DataOutputStream. También encontrará métodos complementarios a los de DataInputStream: void writeBoolean( boolean b ); void writeByte( int i ); void writeShort( int i ); void writeInt( int i ); ….. void writeChars( string s );

27 Práctica manejo de archivos
Curso de Java y Aplicaciones Web Grabación en archivo.

28 Práctica manejo de archivos
Curso de Java y Aplicaciones Web Lectura de archivo.

29 Archivos de Acceso Aleatorio
Los archivos de acceso secuencial son extremadamente útiles para la mayoría de las aplicaciones, pero a veces son necesarios archivos de acceso aleatorio que permiten acceder a sus contenido en forma no secuencial, o aleatoria. La clase RandomAccessFile del paquete java.io, implementa un archivo de acceso aleatorio. Puede ser usada tanto para lectura como para escritura de bytes. Todo objeto, instancia de RandomAccessFile soporta el concepto de puntero que indica la posición actual dentro del archivo. Es un entero que empieza en 0 y se mide en bytes. RandomAccessFile provee comandos para operar sobre el puntero.

30 Archivos de Acceso Aleatorio
Constructores: public RandomAccessFile(String name, String mode) throws FileNotFoundException public RandomAccessFile(File file, String mode) throws FileNotFoundException Crea un archivo de acceso aleatorio. El modo puede ser: “r”: Se abre el archivo para solo lectura. “rw”: Abre el archivo para lectura y escritura. Si el archivo aún no existe, lo crea.

31 Archivos de Acceso Aleatorio
La clase RandomAccessFile implementa las interfaces DataInput y DataOutput, por lo que tiene acceso a todas las operaciones read() y write() de las clases DataInputStream y DataOutputStream que también implementan las interfaces DataInput y DataOutput respectivamente. También se tienen métodos para moverse dentro de un fichero: long getFilePointer(): Devuelve la posición actual del puntero del fichero. void seek( long pos ): Coloca el puntero del fichero en una posición determinada. La posición se da como un desplazamiento en bytes desde el comienzo del fichero. La posición 0 marca el comienzo de ese fichero. long length(): Devuelve la longitud del fichero. La posición length() marca el final de ese fichero.

32 Ejemplo Write

33 Ejemplo Read

34 Java Api Reflection Curso de Java y Aplicaciones Web Mediante la Java Reflection API el programador puede inspeccionar y manipular clases e interfaces (así como sus métodos y campos) en tiempo de ejecución, sin conocer a priori (en tiempo de compilación) los tipos y/o nombres de las clases específicas con las que está trabajando.

35 La clase “Class” To find out about a class, first get its Class object
Curso de Java y Aplicaciones Web To find out about a class, first get its Class object Class c = obj.getClass(); Class sup = c.getSuperclass(); Class c = Button.class; Class c = class.forName(str);

36 Getting the class name Curso de Java y Aplicaciones Web If you have a class object c, you can get the name of the class with c.getName() getName returns the fully qualified name; that is, Class c = Button.class; String s = c.getName(); System.out.println(s); will print java.awt.Button Class Class and its methods are in java.lang, which is always imported and available

37 Constructor[] userConstructors = userClass.getConstructors();
Constructores Curso de Java y Aplicaciones Web Podemos acceder a la lista de todos los constructores de una clase mediante el método: Constructor[] userConstructors = userClass.getConstructors(); Si conocemos los tipos de los parámetros de un constructor en particular, podemos acceder a ese constructor concreto sin tener que recorrer toda la lista: Constructor userConstructor = userClass.getConstructor( new Class[] {String.class, String.class, Integer.class});

38 Constructores Curso de Java y Aplicaciones Web Una vez hallamos conseguido el constructor deseado, podemos instanciar un objeto mediante el métodonewInstance() con los parámetros adecuados. En nuestro ejemplo: Constructor userConstructor = userClass.getConstructor(new Class[] {String.class, String.class, Integer.class}); User user = (User) userConstructor.newInstance("Antonio González", 12);

39 Atributos Curso de Java y Aplicaciones Web Para acceder a los atributos públicos de una clase tenemos dos posibilidades. Si conocemos el nombre del atributo usaremos la siguiente instrucción: Field userField = userClass.getField("name"); Si por cualquier motivo no conocemos los nombres de los atributos, tenemos una forma de obtener todos los atributos públicos de una clase de la siguiente forma: Field[] userFields = userClass.getFields();

40 Atributos Nueva instancia: Object userInstance =
Curso de Java y Aplicaciones Web String fieldName = userField.getName(); Object fieldType = userField.getType(); Object fieldValue = userField.get(userInstance); userField.set(userInstance, value); Nueva instancia: Object userInstance = userClass.getConstructor( new Class[] {String.class} ).newInstance( new Object[] {"José González"} ); Valor para un atributo: Field aliasField = userClass.getDeclaredField("alias"); aliasField.setAccessible(true); aliasField.set(userInstance, "Pepe");

41 Metodos Curso de Java y Aplicaciones Web De forma totalmente análoga a como accedimos a los atributos de una clase, podemos acceder a todos los métodos públicos de una clase mediante: Class userClass = Class.forName("com.test.model.User"); Method[] userMethods = userClass.getMethods(); Method userMethod = userClass.getMethod("setAlias", new Class[] {String.class}); String methodName = userMethod.getName(); Object methodType = userMethod.getReturnType(); userMethod.invoke(o, "Jose");

42 Ejemplo Curso de Java y Aplicaciones Web

43 Ejemplo Curso de Java y Aplicaciones Web

44 Ejemplo Curso de Java y Aplicaciones Web

45 Ejemplo Curso de Java y Aplicaciones Web

46 Ejemplo Curso de Java y Aplicaciones Web

47 Ejemplo Curso de Java y Aplicaciones Web

48 Curso de Java y Aplicaciones Web.
Gracias!... Curso de Java y Aplicaciones Web. Ing. Esteban Ramírez


Descargar ppt "Curso de Java y Aplicaciones Web"

Presentaciones similares


Anuncios Google