La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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

Presentaciones similares


Presentación del tema: "Curso de Java y Aplicaciones Web Facultad Politécnica – U.N.A. Ing. Esteban Ramírez Multi-threaded y manejo de archivos."— Transcripción de la presentación:

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

2 Objetivos Archivos Threads Reflexion Curso de Java y Aplicaciones Web

3 Java multihilos 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. Curso de Java y Aplicaciones Web 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();

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 { Thread.sleep(1000); 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();... }

11 Curso de Java y Aplicaciones Web Clase Thread 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 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 Curso de Java y Aplicaciones Web

13 Comunicación entre Hilos 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. Curso de Java y Aplicaciones Web

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 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. Curso de Java y Aplicaciones Web

16 Practica de hilos Curso de Java y Aplicaciones Web

17 Practica de hilos Curso de Java y Aplicaciones Web

18 Manejo de archivos 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. Curso de Java y Aplicaciones Web

19 Creación de un objeto File 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" ); Curso de Java y Aplicaciones Web Company Logo

20 Comprobaciones y Utilidades 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() Curso de Java y Aplicaciones Web

21 Comprobaciones y Utilidades 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.). Curso de Java y Aplicaciones Web

22 Objetos FileInputStream 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(). Curso de Java y Aplicaciones Web

23 Objetos DataInputStream 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. Curso de Java y Aplicaciones Web

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

25 Objetos FileOutputStream 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. Curso de Java y Aplicaciones Web

26 Escritura DataOutputStream 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 ); Curso de Java y Aplicaciones Web

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 FileNotFoundExceptionString FileNotFoundException public RandomAccessFile(File file, String mode) throws FileNotFoundExceptionFile StringFileNotFoundException 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 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. Curso de Java y Aplicaciones Web

35 La clase Class 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 Constructores 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}); Curso de Java y Aplicaciones Web

38 Constructores 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); Curso de Java y Aplicaciones Web

39 Atributos 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(); Curso de Java y Aplicaciones Web

40 Atributos 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"); Curso de Java y Aplicaciones Web

41 Metodos 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"); Curso de Java y Aplicaciones Web

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. Ing. Esteban Ramírez


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

Presentaciones similares


Anuncios Google