Date post: | 21-Dec-2015 |
Category: |
Documents |
Upload: | jennyanccori |
View: | 214 times |
Download: | 2 times |
Java
Lenguaje de Programación Orientado a Objetos Multiplataforma, portable. Compilado e Interpretado Creador :James Gosling Empresa: Sun Microsystems Data: 1990
La Máquina Virtual JVM
Es el componente de la tecnología encargado de mantener la independencia de la plataforma.
Llamada “HotSpot”. Es una máquina computacional abstracta. Con
su juego de instrucciones, gestión de memoria, etc.
Compilado – Interpretado - Portable
JVM (Sun, BEA, IBM)
11000110
Producto.java Producto.class
Intérprete
Garbage Collection
Técnica de la JVM que libera de memoria a un objeto cuando ya no es referenciado (usado).
También combate la fragmentación de la memoria, todo en tiempo de ejecución del programa.
Reciclado de Memoria
Objetos
Un objeto puede caracterizar una entidad física (coche) o abstracta (ecuación matemática)
Objeto = unidad atómica que encapsula estado y comportamiento
Clase
Clase es la representación abstracta de uno o más objetos.
La clase define el ámbito de definición de un conjunto de objetos idénticos.
Cada objeto pertenece a una clase Los objetos se crean por instanciación de las
clases. Una clase se almacena en un archivo y el
nombre de este archivo debe coincidir con el nombre de la clase.
Definición de Clase en Java
ámbito class NombreDeClase
{
//propiedades
//métodos
}
------------------------------------------------
Donde ámbito: public, final, abstract
Tipos de clase
abstract : Una clase abstract tiene al menos un método abstracto. Una clase abstracta no se instancia, sino que se utiliza como clase base para la herencia.
final :Una clase final se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final. Por ejemplo, la clase Math es una clase final.
public: Las clases public son accesibles desde otras clases, bien sea directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes, primero tienen que ser importadas.
Definición de propiedades, variables
Tipo nombre_propiedad; Tipo nombre_variable;
Donde tipo:
Tipo Description
byte -128 to +127, 1 byte (8 bits) in memory
short -32768 to 32767 , 2 bytes (16 bits) in memory
int -2147483648 to 2147483647 , 4 bytes (32 bits) in memory
long -9223372036854775808 to 9223372036854775807 , 8 bytes (64 bits) in memory
Tipo Descripcion
float -3.4E38 (-3.4x1038) to +3.4E38 (+3.4x1038) , 4 bytes in memory. 7 digits
double -1.7E308 (-1.7x10308) to +1.7E308 (+1.7x10308) ,8 bytes in memory. 17 digits.
Conversión de tipos
Java es un lenguaje fuertemente tipado, es decir, en tiempo de compilación se comprueba la compatibilidad de tipos
Conversión implícita: (automática) tipos primitivos a uno que soporte un rango mayor de valores
float saldo = 300; //podemos asignarle un entero
int codigo = 3.7; //ERROR
Conversión explícita: tipos primitivos perdiendo información
long l = 223456723456;
int i = (int)l;
Métodos
Tipo_de_retorno nombreMétodo(tipo1 param1, tipo2 param2, …)
{
…..
…….
return resultado; // no se pone si no retorna nada
}
Donde:
- Tipo_de retorno: int, String, boolean,…
- Si no retorna nada entonces Tipo_de_Retorno es void
Paquetes
Un paquete es un conjunto de clases agrupadas en un directorio.
Se le define un classpath para su búsqueda. El nombre del paquete es el nombre de la ruta
contada a partir de su classpath. Ejemplos:
Acceso desde: private protected public (package, default)
la propia clase S S S S
subclase en el mismo paquete N S S S
otras clases en el mismo paquete N S S S
subclases en otros paquetes N X S N
otras clases en otros paquetes N N S N
Ámbito de Métodos y Variables de Clases
Herencia
• Una subclase hereda de su superclase métodos y
variables tanto de clase como de instancia.
• Una subclase puede añadir nuevos métodos y variables.
• Una subclase puede redefinir métodos heredados.
• Sintaxis:class nombreHija extends nombrePadre {…}
• Por defecto toda clase extiende la clase Object
class Contador {…} class Contador extends Object {…}
Herencia
• Herencia simple
• Object es la clase raíz (paquete java.lang)
• Object describe las propiedades comunes a todos los objetos
Object
A B
C D
Terminología:- C y D son subclases de B- B es la superclase de C y D
Herencia. Clase Object
Todas las clases heredan directa o indirectamente de la clase Object, raíz de la jerarquía.
Toda clase tiene disponibles sus métodos:
public final Class getClass() clase que representa el tipo del objeto
public boolean equals(Object obj) igualdad de valores public String toString() Devuelve la representación del obj
en un String
protected Object clone() devuelve una copia del objeto public int hashCode() devuelve un código que identifica de
manera única al objeto- protected void finalize() relacionado con liberar memoria
Hay que redefinir equals, toString, hashCode y clone para adaptarlos.
Definición en Java
class Clase_Hija extends Clase_Padre{ //propiedades
//métodos}
Clase_Padre: Superclase
Ejemplo
public class ContadorColoreado extends Contador {//nueva variable de instanciaprivate String color ;
public ContadorColoreado(){super();setColor(“transparente”);
}public ContadorColoreado(int v, int s, String
c) {super(v,s);setColor(c);
}...
}
Llamada al constructor del
padre
Object
Contador
ContadorColoreado
Overwriting - Redefinición
Un método de la subclase con la misma signatura y valor de retorno que un método de la superclase lo está REDEFINIENDO.
Los métodos solo se diferencian entre número de parámetros y/o tipo de datos entre sus parámetros.
Para evitar la redefinición de un método se utiliza el modificador final.
Los atributos no se pueden redefinir, sólo se OCULTAN (el campo de la superclase todavía existe pero no se puede acceder).
Ejemplo redefiniciónpublic class Poligono{ private Punto [] vertices; private int numVertices; … public float perimetro(){ //{} double peri=0; Punto anterior=vertices[0]; Punto actual; int ultimo=numVertices-1; for (int i=1; i<=ultimo; i++){ actual=vertices[i]; peri+=anterior.distancia(actual); anterior=actual; } //distancia del ultimo con el primero return peri+=vertices[ultimo].distancia(vertices[0]); }}
public class Rectangulo extends Poligono{ //{} private double lado1; privare double lado2;
… public float perimetro(){ return 2*lado1+2*lado2; }}
Añade atributos
Redefine métodos
super
Palabra clave disponible en todos los métodos no-static
Se invoca a la versión del método de la primera superclase que lo contenga
Ejemplo:
public class Punto{… //(x,y)public void borrar(){}
}
public class Pixel extends Punto{…
public void borrar(){ super.borrar(); //borra el Punto
color = null; }
}
class Uno { public int test(){return 1;} public int result1(){return this.test();}}
class Dos extends Uno{ public int test(){return 2;}}
class Tres extends Dos{ public int result2(){return this.result1();} public int result3(){return super.test();}}
class Cuatro extends Tres{ public int test(){return 4;}}
Uno
Tres
Dos
Cuatro
Ejemplo super
Acceso desde: private protected public (package-default)
la propia clase S S S S
subclase en el mismo paquete N S S S
otras clases en el mismo paquete N S S S
subclases en otros paquetes N X S N
otras clases en otros paquetes N N S N
Ámbito de Métodos y Variables de Clases
X: puede acceder al atributo en objetos que pertenezcan a la subclase, pero no en los que pertenecen a la clase padre.
Clases: Encapsulación
La encapsulación en un objeto permite una alta cohesión y un bajo acoplamiento, favorece la modularidad y el mantenimiento
Los atributos de una clase no deberían ser manipulables directamente por el resto de objetos
Clases: Encapsulación
Niveles de encapsulación Java: Private Public Protected
Class Movil{ private int numero; public int getNumero() {
return this.numero; } public void setNumero(int num) { this.numero=num; }}
Interfaces
Son un conjunto de métodos y/constantes abstractas que podrán ser implementados en cualquier clase que la necesite. Un interface es una expresión de diseño, mientras
que una clase es una expresión de diseño e implementación.
Las clases pueden implementar más de una interface. public interface ConversionFactors
{ double CONSTANTE1 = 25.4;
double CONSTANTE2 = 28.349523125;double CONSTANTE3 = 453.5924; public static double convierte(double cantidad) ;
}
Implementando la Interface …public OtraClase class implements ConversionFactors {
public static double convierte(double cantidad) {
return cantidad*CONSTANTE1; // opcional}
……. }
Notas - Interfaces
Todos lo métodos de las interfaces son implícitamente public y abstract. No se necesita tipear en la declaración del método public ni abstract.
Todas las variables definidas en un interface deberán ser public, static, and final, es decir, las interfaces pueden declarar solo constantes, no variables de instancia.
Los métodos de una interface no deben ser static. Como los métodos de la interfaces son abstract, ellos no pueden ser
final, struct, o native. Una interface puede extender uno o más interfaces. Una interface no puede ser declaradas con la keyword abstract Una interface no puede extender nada de otras clases. Una interface no puede implementar otra interface o clase. Una interface solo puede ser declarada con la keyword interface. Una Interface puede ser usada para polimofismo.
Clases abstractas
Se fija un conjunto de métodos y atributos que permitan modelar un cierto concepto, que será refinado mediante la herencia.
Métodos abstractos: sólo cuentan con la declaración y no poseen
cuerpo de definición la implementación es específica de cada
subclase Toda clase que contenga algún método
abstracto (heredado o no) es abstracta. Puede tener también métodos efectivos.
Tiene que derivarse obligatoriamente NO se puede hacer un new de una clase abstracta.
Ejemplos
public abstract class Figura {
public abstract void dibujar();
public abstract void rotar();
...
}
public class Rectangulo extends Figura {
public void dibujar(){
//código especifico para dibujar rectángulos...
} ...
}
Agenda Propósito de los patrones Fundamentos de diseño.
•Creación.–Factory Method–Singleton–Abstract Factory
•Estructurales–Adapter–Facade–Composite
•Comportamiento–Command–State –Observer
¿Qué es un patrón de diseño? Ante un problema reiterado ofrece una
solución contrastada que lo resuelve. Describe el problema en forma sencilla. Describe el contexto en que ocurre. Describe los pasos a seguir. Describe los puntos fuertes y débiles de
la solución. Describe otros patrones asociados.
¿Por qué usarlos? Mejora en la comunicación y
documentación “Hay que hacer un Factory Method” Facilita la documentación interna del proyecto.
Mejora la ingeniería de software. Eleva el nivel del grupo de desarrollo.
Previene “reinventar la rueda” en diseño Son soluciones ya probadas.
Mejora la calidad y estructura “¿Cuan grande debe ser una clase?”
Singleton
Problema: No se puede tener mas de una instancia de
una clase. Se necesita controlar el acceso a una clase.
-ClaseUnica()+ObtenerInstancia() : ClaseUnica+Operacion1()
-instancia : ClaseUnica
ClaseUnica
Singleton
if (instancia==null){ Mutex mutex = new Mutex(); mutex.WaitOne(); if(instancia==null) instancia = new ClaseUnica(); mutex.Close();}return instancia;
if (instancia==null) instancia = new ClaseUnica();return instancia;
• Cambio el constructor a privado.• Hago que la clase no pueda ser
heredada.• Agrego una variable estática del
mismo tipo de la clase donde esta contenida. (instancia)
• Agrego un método estático que retorne la variable estática. (GetInstance)
• No creo el objeto hasta que sea necesario (Lazy Creation)
• Agrego el código necesario para no crear dos instancias en distintos thread.
Factory Method
Patrón de creación (ámbito de clase) Propósito: “Define una interfaz para crear un
objeto, pero deja que sean las subclases quienes decidan la clase del objeto a crear.” La instancia del objeto a crear depende de
condiciones externas a la clase cliente. Puede cambiar independientemente de
cambiar la clase cliente.
Colecciones en Java
Permite almacenar y organizar objetos de manera útil para un acceso eficiente.
Se encuentran en el paquete java.util Núcleo de abstracciones de colecciones de utilidad
(interfaces) e implementaciones ampliamente útiles. Las interfaces proporcionan métodos para todas las
operaciones comunes y las implementaciones concretas especifican la decisión de las operaciones no permitidas.
(java.lang.UnsupportedOperationException) Sobre los elementos se puede iterar (Iterator)
Colecciones Interfaces
- interface Collection- clases ArrayList, LinkedList,
HashSet, TreeSet
- interface Map- clases TreeMap, HashMap
- Iteratores: interfaz Iterator
Jerarquía de colecciones
Collection
ListIterator
Iterator Map
AbstractMapSortedMap
AbstractSequentialList
TreeMap HashMapSortedSet
AbstractSetAbstractList
AbstractCollection
SetList
HashSet TreeSet
ArrayList
LinkedList
extendsimplements
class
interface
devuelve
devuelve
devuelve
Interface Collection (1/2)
- Collection- int size()- boolean empty()- boolean contains(Object elem)- Iterator iterator()- Object[] toArray(), Object[] toArray(Object dest[])- boolean add(Object elem),- boolean remove(Object elem)- void clear()
- List – Una colección cuyos elementos permanecen en un orden particular a menos que se modifique la lista (no significa lista enlazada aunque es una posible implementación).
- void add(int index, Object element)- Object remove(int index)- Object get(int index)- Object set(int index, Object element)- int indexOf(Object o)- int lastIndexOf(Object o)- List subList(int min, int max)
Interface Map
- Map- Un objeto que asocia claves con valores. - No puede tener claves duplicadas. Object put(Object key, Object value); Object remove(Object key); Object get(Object key);
containsKey, containsValue, isEmpty, size- Proporciona tres vistas de colección: colección de claves
(keySet), colección de valores (values), colección de asociaciones clave-valor (entrySet).
- SortedMap: Un mapa cuyas claves están ordenadas.- Object firstKey(), Object lastKey(), SortedMap subMap(Object minKey, Object maxKey), SortedMap headMap(Object maxKey), SortedMap tailMap(Object minKey)
Interface Collection (2/2)-Set – Una colección (conjunto) donde no puede haber elementos repetidos, y cuyos elementos no se almacenan necesariamente siguiendo un orden particular.
- Mismos métodos que Collection con otro contrato.
-SortedSet – Conjunto con elementos ordenados.-Object first()-Object last()-SortedSet subSet(Object fromElement, Object toElement)-SortedSet headSet(Object toElement)-SortedSet tailSet(Object fromElement)
IteraciónCollection >> Iterator iterator();
interface Iterator{boolean hasNext();/* Devuelve true si la iteración tiene mas elementos */
Object next();/* Devuelve el siguiente elemento de la iteraciónLanza excepción NoSuchElementException */
void remove();/* Elimina el último elemento devuelto por la iteraciónEstá capacitado para decir que no lo implementaUnsupportedOperationException */
}
La interfaz ListIterator extiende a Iterator y maneja un objeto List ordenado. Permite iterar hacia delante y hacia atrás.
Ejemplo de uso de Iteradores
Cálculo del gasto total de un departamento
public double gastoDpto(){
double gasto=0;
Iterator it=plantilla.iterator();
while (it.hasNext()){
gasto+=((Empleado)it.next()).getSueldo();
}
return gasto;
}
Siendo plantilla una colección que implemente la interfaz Collection
Clases genéricas
class Cosa<T> { T nombre; public Cosa(T nombre) { this.nombre = nombre; } public void setNombre(T nombre) { this.nombre = nombre; } public T getNombre() { return nombre; }}
Usando clases genéricas
Cosa<String> cosa = new Cosa<String>("pedro");String nombre = cosa.getNombre();cosa.setNombre(new Integer(1)); // FALLO !!!
Métodos genéricos
class Bicho {public <T> T getBicho(T aBicho) { return aBicho; } public <T> void doBicho(T aBicho) { T bicho2 = aBicho; (…) }public static <T> T getBicho(T aBicho){
return aBicho;}
}
Polimorfismo paramétrico: Generics
Permite parametrizar tipos Ejemplo de Colecciones: List<Animal>
Permite al compilador asegurar la validez de los tipos Mueve el control de errores del tiempo de
ejecución (ClassCastException) al tiempo de compilación
Mejora la robustez y legibilidad del código
Ejemplo Antes:
Animal perro = new Animal();List granja = new ArrayList();granja.add(perro);Animal a = (Animal)granja.get(0);granja.add(“hola”);Animal a = (Animal)granja.get(1); // ERROR !!!
Después:Animal perro = new Animal();List<Animal> granja = new ArrayList<Animal>();granja.add(perro);Animal a = granja.get(0); // SIN CASTINGgranja.add(“hola”); // ERROR !!!
Simplemente te ahorra castings ? Chequeo en tiempo de compilación
Si introducimos otro tipo nos avisa, no falla con ClassCastException en tiempo de ejecución
Refuerza las relaciones entre clases Ahora sabemos que un banco tiene una
lista de Cuentas. Es más legible y obliga al programador.
AutoBoxing
Esta técnica se ha añadido a Java para: suplir la carencia de no poder utilizar generics con los tipos
simples minimizar el número de casts y “news” necesarios para trabajar
con colecciones
Vector<Integer> vi=new Vector<Integer>(1);vi.setElemento(0,35); // * Autoboxing
int i=vi.getElemento(0); // * Unboxing
En general, existe una conversión automática y simétrica entre tipos simples y sus clases envoltorioDouble od=34.45; // * Autoboxing
double ds=od; // * Unboxing
Enumerados
Las enumeraciones de elementos se solían hacer en Java 1.4 con
atributos de clase enteros y constantesclass Naipes{
static public final int OROS=0;static public final int COPAS=1;static public final int ESPADAS=2;static public final int BASTOS=3;private final int numero;private final int palo;}
Los inconvenientes mayores que producían eran. No son seguros respecto al tipo (permiten utilizar cualquier entero, aunque no tenga sentido)
Naipes(int numero,int palo) {
this.numero=numero;
this.palo=palo;
}
Enumeradospublic enum Palo {OROS, COPAS, ESPADAS, BASTOS}
class Naipes{
private final int numero;
private final Palo palo;
Naipes(int numero,Palo palo) {
this.numero=numero;
this.palo=palo;
}
}
public class App {
public static void main(String[] args) {
Naipes q =new Naipes(1, Naipes.Palo.OROS);
for( Naipes.Palo palo:Naipes.Palo.values() )
System.out.println(palo);
}
}
Varios Argumentos de un Método En Java 1.5 se ha añadido la posibilidad de
utilizar lista
variable de argumentos (…)
public static void mostrar (Object... cosas) {for (Object cosa:cosas)
System.out.println("Elemento i: "+cosa);
}
public static void main(String[] args) {mostrar(1,2,"Hola"); // * Autoboxing
}
Import a miembros estáticos de una clase En el caso de que tengamos que hacer uso
intensivo de los miembros de una clase deutilidad, se ha ampliado en Java 1.5 la cláusula
importpara miembros de clase:
import static java.lang.Math.*;
public class App
{
public static void main(String[] args) { double coseno=cos(PI/4); System.out.println(""+coseno);
}
}
Excepción
Es una señal de un mal funcionamiento del programa o del sistema en general.
Puede ser generado por el mismo interprete o ser lanzado por el mismo programador que quiere alertar que existe una sentencia con problemas.
Tipos
Checked Exceptions: Significa que el compilador chequea que los métodos lancen solo la Excepción que ellos mismos lo tiene declarados para lanzarlos.
Unchecked Runtime Exceptions: Representan errores que se generan en la lógica de programación en tiempo de ejecución y que razonablemente no pueden ser recuperados. Por ejemplo: ArrayIndexOutOfBoundsException. Prevenir esto podría ser impráctico capturarlo.
Class Name Exception Condition Represented
ArithmeticException An invalid arithmetic condition has arisen such as an attempt to divide an integer value by zero.
IndexOutOfBoundsException
You've attempted to use an index that is outside the bounds of the object it is applied to. This may be an array, a String object, or a Vector object.
NegativeArraySizeException
You tried to define an array with a negative dimension.
NullPointerException You used an object variable containing null, when it should refer to an object for proper operation - for example, calling a method or accessing a data member.
ArrayStoreException You've attempted to store an object in an array that isn't permitted for the array type.
ClassCastException You've tried to cast an object to an invalid type - the object isn't of the class specified, nor is it a subclass, or a superclass, of the class specified.
IllegalArgumentException
You've passed an argument to a method which doesn't correspond with the parameter type.
SecurityException Your program has performed an illegal operation that is a security violation. This might be trying to read a file on the local machine from an applet.
IllegalMonitor StateException
A thread has tried to wait on the monitor for an object that the thread doesn't own. (We'll look into threads in Chapter 11).
Propias Excepciones
Se crea una clase que hereda de la clase Exception
Para generar la excepción se usa la sentencia: throw new PropiaExcepcion()
Ejemplo:
Lanzando Excepciones
double myMethod() throws IOException, FileNotFoundException
{ // codigo …
} Otra forma:
try {
// Código que genera un excepción aritmética
} catch(ArithmeticException e)
{
// proceso de la excepción
throw e; // Relanza la exception al programa que lo llama
}
Otra forma de relanzar una Excepcióntry {
// Código que genera un excepción aritmética
} catch(ArithmeticException e)
{
// proceso de la excepción
throw e; // Relanza la exception al programa que lo llama
}
IP Addresses
Java tiene la calse java.net.InetAddress el cuál abstrae la direcciones de red.
Sigue los siguientes propósitos: Encapsular y direccionar Lleva a cabo consultas de nombre
(convirtiendo un nombre de host a IP) Hace reversas (direcciones a nombre)
java.net.InetAddress
Static construction usando factory InetAddress getByName(String hostName)
hostName puede ser “host.domain.com.pe”, o hostName puede ser “170.90.72.14”
InetAddress getLocalHost() Algunos métodos:
String getHostName() Obtiene el host name (ejemplo:
“www.sun.com”) String getHostAddress()
Obtiene tu IP (ejemplo“170.18.97.241”) InetAddress getLocalHost() InetAddress[] getAllByName(String hostName)
Usando InetAddress objects
import java.net.InetAddress;import java.net.UnknownHostExcepion;
public static void main(String[] args){ try { InetAddress inet1 = InetAddress.getByName(“novatel.edu.pe"); System.out.println( "HostAddress=" + inet1.getHostAddress()); InetAddress inet2 = InetAddress.getByName("170.95.72.13"); System.out.println("HostName=" + inet2.getHostName()); if (inet1.equals(inet2)) System.out.println("Addresses are equal"); } catch (UnknownHostException uhe) { uhe.printStackTrace(); }}
Socket
Es un software central que establece la comunicación bidireccional entre un servidor programa y uno o más programas cliente.
Al socket se le asocia con un específico puerto en la maquina donde corre software. Por eso cualquier programa de la red se puede comunicar con él.
Request – response Un servidor puede atender muchos clientes usando
Multithreads en donde cada thread acepte la conexión con el cliente y continúen escuchando los requests de otros clientes.
Tipos de TCP Socket
java.net.ServerSocket es usado por servidores que pueden aceptar incomming TCP/IP connections Un servidor es una pieza de software el cual
hace público y provee una serie de servicios a requerimiento.
java.net.Socket es usado por clientes que desean establecer conexión remota a un servidor. Un cliente es una pieza de software usualmente
sobre diferente máquina el cual hace uso del servicio.
java.net.ServerSocket
Escucha sobre un puerto conocido incoming connections
Provee un Socket de comunicación para un puerto dado.
Mantiene una cola que asegura las conexiones con los clientes y no los pierde.
java.net.ServerSocke
Construction: ServerSocket(int port, int backlog)
Some useful methods: Socket accept()
Espera a un cliente que intente establecer conexión con el servidor.
void close() Llamado por el servidor cuando se intenta bajar
el servicio y asegurar la liberaciónd e recursos.
java.net.Socket
Provee acceso a TCP/IP streams Bi-directional comunicación entre sender
and receiver Puede ser usado para conectarse a
direcciones remotas y puertos: Socket(String remoteHost, int port)
También es usado para aceptar un incoming connection.
java.net.Socket
Puede obtenerse el accesos a input and output streams
Input stream permite la recepción de la data de otras partes InputSteam getInputStream()
Output stream permite despachar la data hacia otras partes OutputStream getOutputStream()
Funcionamiento
2037 80
2037 1583
2037 1583
Client (sid) Server (fred)
ServerSocket ss.s = ss.accept()
s = new Socket(“Carl”, 80)
Socket s
s.getInputStream()s.getOuputStream()
s.getInputStream()s.getOuputStream()
TCP serverpublic static void main(String[] args){ try { ServerSocket agreedPort = new ServerSocket(AGREED_PORT_NUMBER, 5);
while (isStillServing()) { Socket session = agreedPort.accept(); respond(session); session.close(); }
agreedPort.close(); } catch (UnknownHostException uhe) { // Very unlikely to occur } catch (IOException ioe) { // May occur if the client misbehaves? } }
TCP client
public static void main(String[] args){ try { InetAddress server = InetAddress.getByName(args[0]); Socket connection = new Socket(server, AGREED_PORT_NUMBER); makeRequestToServer(connection); getReplyFromServer(connection); connection.close(); } catch (UnknownHostException uhe) { // arg[0] is not a valid server name or IP address } catch (IOException ioe) { // The connection to the server failed somehow: // the server might have crashed mid sentence? }}
Definición
ThreadThread es una pieza de código que es una pieza de código que puede ser ejecutada concurrentemente puede ser ejecutada concurrentemente con otra dentro de un mismo contexto.con otra dentro de un mismo contexto.
Concurrency Models I
Processes versus Threads
Operating System
Threads Fibres Process
thread library
Thread Lifecycle: 4 states
RUNNABLE
runningnot
running
BLOCKED/WAITING/
TIMED_WAITINGNEW
TERMINATED
start()
Thread Lifecycle: 4 states
RUNNABLE
runningnot
running
BLOCKED/WAITING/
TIMED_WAITINGNEW
TERMINATED
start()
sleep()block on I/O
wait()
Thread Lifecycle: 4 states
RUNNABLE
runningnot
running
BLOCKED/WAITING/
TIMED_WAITINGNEW
TERMINATED
start()
sleep()block on I/O
wait()
time elapsedI/O donenotify()
Thread Lifecycle: 4 states
RUNNABLE
runningnot
running
BLOCKED/WAITING/
TIMED_WAITINGNEW
TERMINATED
start()
sleep()block on I/O
wait()
time elapsedI/O donenotify()
run() methodreturns
Non-Existing
New
Executable
Blocked Dead
start
create thread object
run method exits
Non-Existing
garbage collectedand finalization
wait, joinnotify, notifyAllthread termination
destroy
destroy
destroy
El thread es creado Hasta este punto el thread no es ejecutado — Java
llama a este punto el estado new state Una vez que el método startes llamado, el
thread llega a ser elegible para la ejecución según la agenda.
Si el thread llama al método wait desde su objeto, o al método join desde otro objeto, el thread se bloquea es decri se pone en un estado blocked y no será elegible par ala ejecución.
Este llegará a ser ejecuable cuando otro thread le notifique travéz de su método notify, o si el thread que estuvo en join, llega a dead.
Ejemplo: Thread
public class SimpleThread extends Thread {public SimpleThread(String str) {
super(str); } public void run() {
for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep((long)(Math.random() * 1000)); } catch (InterruptedException e) {}}System.out.println("DONE! " + getName());
}}
Sincronización
Cuando tenemos varios threads, muchas veces deseamos que éstos puedan compartir datos u objetos, por lo tanto, es indispensable saber sincronizar sus actividades; ésto también nos permitirá evitar la colisión o mal procesamiento.
Daemon Threads
Java threads pueden ser de dos tipos: user threads o daemon threads
Daemon threads son aquellos threads que proveen servicios generales y típicamente no terminan.
Cuando todos los threads hayan terminado, los daemon threads también terminan cuando el programa principal termina.
El método setDaemon debe ser llamado antes de que el thread sea iniciado con start.
public class Thread extends Object implements Runnable { ... public void destroy(); // DEPRECATED
public final boolean isDaemon(); public final void setDaemon();
public final void stop(); // DEPRECATED
}
Un Thread Termina:
Cuando termina la ejecución de un método run o se genera una excepción de tipo interrupted.
Vía una llamada la método stop (deprecated) Llamando el método destroy
----- PD: join() espera a que el thread temine de
ejcutarse.
Executor
La más importante característica nueva para el manejo de multiprocesamiento de aplicaciones es el nuevo Framework Executor de Java 5.
Permite resolver la cancelación y cierre de los threads en una situación de multiproceso y sin control de número de threads.
java.util.concurrent.Executor es un objeto que ejecuta Runnable tasks.
Es similar a la llamada:
nuevo Thread (aRunnableObject). start (); Se usa así:
Executor proceso = Factoria_método; exector.execute (aRunnable);
Executors, pool
Hay varias Executors disponibles en la clase java.util.concurrent.Executors.
Executor pool=Executors.newFixedThreadPool(5);
pool.execute (new RunnableTask1 ()); pool.execute (new RunnableTask2 ());
pool.execute (new RunnableTask3 ()); Aquí se ejecutan las tareas y se completan bajo el control de la Executor, que
reutiliza los threads del pool, según sea necesario sin incurrir en la sobrecarga crear siempre la creación de nuevos hilos.
Se pueden parar los threads con:
executor.shutdown(); executor.shutdown ();
La interface Callable
Java.util.concurrent.Callable La nueva interfaz es mucho nejor que la Runnable, supera dos inconvenientes de Runnable. El método run no puede retornar un resultado pues solo retorna void y no puede lanzar una checked exception.public class MyCallable implements Callable<T>{
public T call() throws Exception {
return data;
}
}
Pool con Callable, ventajas
Callable<Integer> task = new MyCallable();
Future<Integer> taskK =pool.submit(task);
Lab.
Objetivos de la sesión
Crear componentes Swing de interface visual de la plataforma Java.
Usar Layouts para la distribución de componentes.
Controlar los eventos que generan los componentes visuales.
• setBounds(int x, int y, int ancho, int alto);
• setSize(int ancho, int alto);
• setLocation(int x, int y);
• setVisible(boolean b);
ancho
altox
y
Métodos Generales
• add(Component comp);
• remove(Component alto);
• setLayout(LayoutManager mrg);
ObjectComponent
Container• Jcomponent• JPanel• Window• ...
Contenedores
Evento
Componente emisor de Eventos
Listener Activado que escuchaLos Eventos
Respuesta
componente.addTipoListener(implementacionDelObjetoListener);
Manejo de Eventos: Listeners
Acción
Activando e implementando un listener
jButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ………………………
…………………….. } });
public interface ActionListener{ void actionPerformed(ActionEvent e)}
Activando e implementando un listener
jButton1.addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent e) {
…………………………………………………………….
} });
public interface MouseListener void mouseClicked(MouseEvent e) void mouseEntered(MouseEvent e) void mouseExited(MouseEvent e) void mousePressed(MouseEvent e) void mouseReleased(MouseEvent e)
Acciones (eventos) Vs Interfaces Listener
Acción que genera un evento
Tipo de Interfaces Listener
•El usuario hace un click, presiona Return•en un área de texto o selecciona un menú
ActionListener
•El usuario escoje un frame (ventana principal)
WindowListener
•El usuario interactúa con el mouse sobre una componente
MouseListener
•El usuario pasa el mouse sobre una componente
MouseMotionListener
•Una componente se hace visible ComponentListener
•Una componente adquiere el foco del teclado
FocusListener
•Cambia la selección en una lista o tabla
ListSelectionListener
Look and Feel: UIManager.setLookAndFeel(o)
UIManager.getCrossPlatformLookAndFeelClassName() Retorna un string para un look-and-feel garantizado a trabajar .
UIManager.getSystemLookAndFeelClassName() Pa la plataforma por defecto. Sobre Windows será Windows Look & Feel. Sobre Mac OS será Mac OS Look & Feel, etc..
"javax.swing.plaf.metal.MetalLookAndFeel" Propio de Java Look & Feel.
"com.sun.java.swing.plaf.windows.WindowsLookAndFeel" ParaWindows Look & Feel solo para Windows.
"com.sun.java.swing.plaf.motif.MotifLookAndFeel" ParaCDE/Motif Look & Feel. Para cualquier plataforma
"javax.swing.plaf.mac.MacLookAndFeel" Especifica Mac OS Look & Feel, solo puede ser usado para Mac OS.
JOptionPane JOptionPane.showConfirmDialog(); JOptionPane.showMessageDialog(); JOptionPane.showOptionDialog)(); JOptionPane.showInputDialog();
Todos los diálogos son modales (no continúa la ejecución hasta que no se cierra).
Se pueden configurar mediante parámetros: título, mensaje, icono, etc.
JOptionPane
JOptionPane.showMessageDialog( this,
"El mensaje!",
"Título", JOptionPane.INFORMATION_MESSAGE
);
this , si es invocado de un container
JList
Un Jlist presenta un grupo de opciones a elegir
Estas opciones pueden ser Strings, check boxes, combo boxes,menus, radio buttons, tables; en general pueden ser cualquier Object
JList tiene un constructor al que se puede pasar un array de objetos String para que los presente Ventaja de Swing frente AWT
Ejemplo: ListasCargadaConArreglos.java
JComboBox
Se usa en ocasiones en que el usuario debe seleccionar dentro de un grupo finito de datos.
Se usa cuando se le quiere dar al usuario un conjunto de respuestas pre definidas
Tiene dos partes: encabezado (nombre, pe. Sexo, Ciudad) y lista de opciones
Ejemplo: JComboBoxEjemplo.java
ListSelectionListener
Los eventos List selection ocurren cuando una selección en una list o una table cambia o acaba de cambiar .
JCheckBox
Los JCheckBox permite tener botones que pueden ser seleccionados como verdadero o falso.
Se parece mucho a un JButton en la manera de iniciar: new JCheckBox(String texto); new JCheckBox(String texto, boolean seleccionado); new JCheckBox(Icon icono, String texto); new JCheckBox(Icon icono, String texto, boolean
seleccionado); new JCheckBox(Icon icono); new JCheckBox(Icon icono,
boolean seleccionado);
JRadioButton
Los botones de radio son útiles cuando seleccionamos entre algunos valores (que no son tantos como para ponerlos en una lista, o en un JComboBox.
Los botones de radio, se inicializan como cualquier boton:
new JRadioButton(String texto); new JRadioButton(String texto, boolean seleccionado); new JRadioButton(Icon icono, String texto); new JRadioButton(Icon icono, String texto, boolean seleccionado); new JRadioButton(Icon icono); new JRadioButton(Icon icono, boolean seleccionado);
Salvo que hay que agregarlos todo a un ButtonGroup para que una selección simple de varios usar new ButtonGroup();
JCheckBox
amarilloboton = new JCheckBox("amarillo"); amarilloboton.setMnemonic(KeyEvent.VK_A); amarilloboton.setSelected(true);
azulboton = new JCheckBox("azul"); azulboton.setMnemonic(KeyEvent.VK_Z);
azulboton.setSelected(true);
Listeners: CheckBoxListener escucha1 = new
CheckBoxListener(); amarilloboton.addItemListener(escucha1); azulboton.addItemListener(escucha1);
JDBC
API de JSE 1.5 que permite ejecutar sentencias SQL y Stored Procedures desde una aplicación Java.
Tiene su propia versión 3.0, 4.0… Tecnología que permite desarrollar
Drivers JDBC. Se hace realidad "write once and run
anywhere"
Driver Categories
Driver Category All Java Network Connection
1. JDBC–ODBC Bridge No Direct
2. Native API as basis No Direct
3. JDBC-Net client, Yes server, Maybe Indirect (Security)
4. Native protocol as basis Yes Direct
Connection con=null;Class.forName("com.mysql.jdbc.Driver");con = DriverManager.getConnection( "jdbc:myDriver:wombat",
"myLogin", "myPassword"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM
Table1");
while (rs.next()) { int x = rs.getInt("a"); String s = rs.getString("b");
float f = rs.getFloat("c"); System.out.println(x, s, f);
}
Connection con = null; PreparedStatement pstmt = null;try {
Class.forName("com.mysql.jdbc.Driver");con = DriverManager.getConnection("jdbc:default:connection"); pstmt = con.prepareStatement( "UPDATE EMPLOYEES SET CAR_NUMBER = ? " + "WHERE EMPLOYEE_NUMBER = ?");pstmt.setInt(1, carNo); pstmt.setInt(2, empNo); pstmt.executeUpdate();
} finally { if (pstmt != null)
pstmt.close(); }
con.setAutoCommit(false); PreparedStatement updateSales =
con.prepareStatement( "UPDATE COFFEES SET SALES = ? WHERE COF_NAME = ?"); updateSales.setInt(1, 50); updateSales.setString(2, "Colombian");updateSales.executeUpdate(); PreparedStatement updateTotal = con.prepareStatement( "UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME = ?"); updateTotal.setInt(1, 50); updateTotal.setString(2, "Colombian"); updateTotal.executeUpdate(); con.commit();
con.setAutoCommit(true);
Problemas de Integridad
Dirty Reads: Sucede cuando se lee una fila que ha sido modificada por alguien y la modificación todavía no ha sido commited.
Phantom Row: Sucede cuando se lee una fila que ha sido borrada por otro proceso, y este borrado no ha sido commited.
Non-Repeatable Read:Una fila es leída para ser modificada. Sin embargo esta ya está siendo modificada por otro proceso.
Niveles de aislamientoIntegridad en Tx con.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTE
D); Válido para toda la sesión
TRANSACTION_NONE TRANSACTION_READ_UNCOMMITTED (1)
Permite leer datos modificados eventualmente aunque la data no haya sido commit.
Es el más permisivo nivel de aislamiento transaccional Rápido Permite dirty reads, phantom rows y non repeatable reads.
TRANSACTION_READ_COMMITTED (2)
Previene los dirty reads, lee datos que han sido modificados con commit.
no controla los phantom rows y non-repeatable read.
TRANSACTION_REPEATABLE_READ (4) Permite leer data modificada que ha sido commitada, pero con la
garantía que la data no va ha ser cambiada de nuevo. Es decir congela el mismo resultado cada ves que la data es leída.
No permite dirty reads y non-repeatable reads. Si permite phantom reads.
TRANSACTION_SERIALIZABLE (8) Bloquea la data tal que una sola transacción a la ves puede
acceder. Es el más restrictivo nivel de aislamiento, alta integridad El más lento No pemite dirty reads, phantom reads ni non-repeatable reads.
Evolución de las versiones JSE Java SE 6 (2006) —Mustang. Sun cambió el
nombre "J2SE" por Java SE Incluye un nuevo marco de trabajo y APIs que
hacen posible la combinación de Java con lenguajes dinámicos como PHP, Python, Ruby y JavaScript.
Incluye el motor Rhino, de Mozilla, una implementación de Javascript en Java.
Incluye un cliente completo de Servicios Web y soporta las últimas especificaciones para Servicios Web, como JAX-WS 2.0, JAXB 2.0, STAX y JAXP.
Mejoras en la interfaz gráfica y en el rendimiento.
Evolución de las versiones JSE Java SE 7 —Dolphin se estima su lanzamiento
para 2009. Soporte para XML dentro del propio lenguaje. Un nuevo concepto de superpaquete. Soporte para closures. Introducción de anotaciones estándar para detectar
fallos en el software. No oficiales:
NIO2 Java Module System. Java Kernel. Nueva API para el manejo de Días y Fechas, la cual
reemplazara las antiguas clases Date y Calendar. Posibilidad de operar con clases BigDecimal usando
operandos.