La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Curs Programació Java: Sessió 8

Presentaciones similares


Presentación del tema: "Curs Programació Java: Sessió 8"— Transcripción de la presentación:

1 Curs Programació Java: Sessió 8
Applets i Threads

2 Que és un Applet? Mini-aplicació Java que s'executa al Browser dins d'una HTML. Tags: <APPLET>... </APPLET> Aplicació gràfica que apareixen a una zona de la finestra del browser.

3 Característiques dels Applets
Son fitxers compilats class Es descarreguen del servidor amb l'HTML S'executa dins la finestra del Browser dins d'un Panel Usen la Java Virtual Machine Poden incloure imatges o audi Es poden provar amb l'aplicació appletviewer del JDK de Sun

4 Restriccions de Seguretat
Es comproven al browser Només poden llegir i escriure fitxers al servidor d'on prové Té limitat l'accés a la informació del Client Trusted applets: Autoritzats a fer certes restriccions

5 Pel que fà al programador...
Deriven de la classe java.applet.Applet. Tenen un mètode main() amb el que comença l'execució S'ha de conèixer el seu Cicle de Vida

6 Cicle de Vida

7 Ancestres de java.applet.Applet

8 Redefinir mètodes Control d'execució (cridats pel browser): init(), start(), stop(), destroy(). Generació GUI: paint() y update(), de Component i Container; repaint() de Component. Obtenció d'informació: getAppletInfo(), getAppletContext(),getParameter(), getParameterInfo(), getCodeBase(),isActive(), getDocumentBase(). Mostrar info statusbar: showStatus() Imatge/só:getImage(), getAudioClip(), play().

9 Mètode init() Es crida automàticament quan el browser o visualitzador ho carga S'encarrega de les tasques d'inicialització Els applets es poden reinicialitzar.

10 Mètode start() Es crida automàticament quan es fa visible, després d'init i quan es torna a mostrar després d'estar amagada Habitualment requereix de threads, per no quedar-se sense recursos Animacions Tasques per internet ...

11 Mètode stop() Es crida automàticament quan s'amaga: Deixa d'estar activa al browser Reload Resize, ... Evita consumir recursos inútilment S'aturen els threads que s'estan executant

12 Mètode destroy() Es crida quan destruïm l'aplicació Útil per demanar confirmació Habitualment no cal redefinir-ho: Allibera els recursos reservats Excepció: Memòria

13 Mètodes per dibuixar l'applet
paint(Graphics g) Tasques gràfiques Es crida quan es dibuixa per primer cop i quan es redibuixa No es s'hauria de cridar mai repaint() Demanar explícitament un redibuix No requereix arguments. Repaint->Update()->Paint() update() Esborra pintant amb el color del fons Crida a paint() => flickering

14 Evitar flickering Parpelleigs al monitor al repintar Dues formes d'evitar el flickering: A. Redefinir update per tal que només esborri lo necessari. B. Redefinir paint() y update() per utilitzar doblebuffer.

15 Com incluir un Applet a un HTML
Tag: <APPLET>…</APPLET> <APPLET CODE="miApplet.class" [CODEBASE="unURL"] [NAME="unName"] WIDTH="wpixels" HEIGHT="hpixels" [ALT="TextAlternatiu"]> [<PARAM NAME="MyName1" VALUE="valueOfMyName1">] [<PARAM NAME="MyName2" VALUE="valueOfMyName2">] </APPLET> []: Opcionals NAME: nom per comunicar-se dins pagina ARCHIVE: indicar fitxers Jar o Zip

16 Pas de paràmetres a un applet
Tags PARAM: nom y valor en strings(cast) Passar paràms del HTML com al main() String getParameter(String name): Obtenir valors dels paràmetres Sempre definir valors per defecte String[][] getParameterInfo() Retorna nom, tipus i descripció dels paràmetres pel programador HTML. Redefinit pel programador del applet

17 Carga d'Applets Per defecte els fitxers *.class es localitzen al mateix directori del HTML Si esta dins d'un package, el browser usa el nom com a camí relatiu al HTML CODEBASE: URL dels fitxers codi Potser relatiu al HTML Si tenim moltes classes *.class, cadascuna necessita una connexió Solució: Agrupar els fitxers en un jar o zip

18 Comunicació Applet-Browser
Controlada amb l'interfície AppletContext implementada pel browser Mètodes per obtenir info i fer certes opers Ex: missatge breus a la barra d'estat getAppletContext().showStatus("Carrega nt des del fitxer " + filename); Mostrar documents HTML showDocument(URL miUrl,[String target]): Al frame target (name,_top,_parent,_blank, _self). showDocument(URL miUrl), a la finestra actual

19 Comunicació Applet-Applet
A la mateixa pàgina del browser Enviar missatges o executar els seus mètodes Missatges: invocat els mètodes de l'altre Alguns browsers posen restriccions Mètodes getApplet(String name): Retorna el nom getApplets(): Retorna els applets de la pàgina Cast de Applet a subclasse concreta Comunicació bilateral El primer s'envia a sí mateix amb this

20 Só en applets interfície AudioClips Mètodes heretats d'Applet public AudioClip getAudioClip(URL url): Retorna l'objecte especificat per url public AudioClip getAudioClip(URL url, String name): Retorna l'objecte especificat per url/name play(URL url), play(URL url, String name) Mètodes d'AudioClip: loop, play, stop Millor carregar el só en altre thread

21 Imatges en applets (JPEG i GIF)
Mètodes Applet: public Image getImage(URL url) public Image getImage(URL url, String name) Mètode drawImage(): public abstract boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) public abstract boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)

22 Obtenció de Propietats del Sistema
Mètode: String salida = System.getProperty("os.arch"); Noms/Propietats accessibles: "file.separator" Separador de directoris ( "/" o "\") "java.class.version" Número de version de Java "java.vendor" Nom específico del vendedor de Java "java.vendor.url" URL del vendedor de Java "java.version" Número de versión Java "line.separator" Separador de líneas "os.arch" Arquitectura del sistema operatiu "os.name" Nom del sistema operatiu "path.separator" Separador en la variable Path No es pot accedir a les seguents propietats del sistema: "java.class.path", "java.home","user.dir", "user.home", "user.name".

23 Threads als applets Es pot executar en diversos threads Threads pares:init(),start(),stop(),destroy() Thread esp. AWT:paint(),update(),repaint() S'han d'introduir amb tasques pesades que poden bloquejar la carrega del applet. Tipus tasques pesades: Es fan un cop:Ex. Carrega d'imatges Repetides:Animació.bucle while o do…while, dins del thread creat al start() i destruit al stop()

24 Threads als applets (II)
Se li ha de passar una referència de l'applet S'ha d'implementar la interface Runnable i redefinir el mètode run() que es fa stop() Els sons s'han de carregar en background Cas típic producer-consumer: Thread – producer Applet – consumer Sincronitzats amb wait() i notifyAll().

25 Ex: Thread amb tasca repetitiva
public void start() { // Es crea un nou thread if (repetitiveThread == null) repetitiveThread = new Thread(this); repetitiveThread.start(); // s'arrenca el thread creat } public void stop() { repetitiveThread = null; // atura el thread } public void run() { ... while (Thread.currentThread() == repetitiveThread) { ... // realizar la tarea repetitiva.

26 APPLETS - APLICACIONS Passos per que un applet sigui una aplicació: 1. Afegir main a la classe MiApplet 2. Al main, crear objecte de MiApplet i introduir-ho a un Frame. 3. Al main, cridar a init() i start()

27 APPLETS – APLICACIONS (II)
Es pot afegir una static inner class que derivi de WindowAdapter y que gestioni l'esdeveniment de tancar la finestra de l'aplicació definint el mètode windowClosing() que crida a System.exit(0) També hauria de cridar a MiApplet.stop() y MiApplet.destroy()

28 Ex: APPLETS – APLICACIONS (I)
public class MiApplet extends Applet { ... public void init() {...} // classe per tancar l'aplicació static class WL extends WindowsAdapter { public void windowClosing(WindowEvent e) { MiApplet.stop(); MiApplet.destroy(); System.exit(0); } } // fin de WindowAdapter

29 Ex: APPLETS – APLICACIONS (II)
// programa principal public static void main(String[] args) { static MiApplet unApplet = new MiApplet(); Frame unFrame = new Frame("MiApplet"); unFrame.addWindowListener(new WL()); unFrame.add(unapplet, BorderLayout.CENTER); unFrame.setSize(400,400); unApplet.init(); unApplet.start(); unFrame.setVisible(true); } } // fin de la clase MiApplet

30 Exemple: EuroConversor

31 EuroConversor.html <html>
<head><title>EuroConversor</title> </head> <body> <h1>EuroConversor Applet</h1> <hr> <applet code=EuroConversor.class height=100 width=400> <param name="next_page" value=" <!-- es on anirem quam premem “Sortir” --> </applet> </body> </html>

32 EuroConversor.java public class EuroConversor extends JApplet implements ActionListener{ private JLabel pesetas, euros; //Etiquetes private JTextField qpesetas, qeuros; //Aquí mostrem les quantitats private JButton pAe, eAp, sortir; // Botons de comanda private float p1E = (float) ; // 1 euro en ptas. public void init(){ pesetas = new JLabel(" Pesetas:"); euros = new JLabel(" Euros:"); qpesetas = new JTextField(10); qeuros = new JTextField(10); pAe = new JButton("Ptas >> Euros"); eAp = new JButton("Euros >> Ptas"); sortir = new JButton("Sortir"); // Hem creat els elements audiovisuals

33 EuroConversor.java Container contentPane = getContentPane();
contentPane.setLayout(new GridLayout(4,3)); contentPane.add(pesetas);// El contentPane representa el contentPane.add(qpesetas);// component visual de l'Applet contentPane.add(pAe); // a qui li donem la forma d'una contentPane.add(euros); // taula de 4x3 cel.les contentPane.add(qeuros); // Amb el mètode add anem omplint contentPane.add(eAp); // les cel.les de dalt a baix i contentPane.add(new JLabel()); // d'esquerra a dreta contentPane.add(new JLabel()); contentPane.add(sortir); pAe.addActionListener(this);// A cada butó li assignem un eAp.addActionListener(this);// receptor (listener: observador) sortir.addActionListener(this);// que serà invocat en el moment } // que es premi. En aquest exemple // Fi del mètode init() serà l'applet mateix qui farà de receptor

34 EuroConversor.java public void actionPerformed(ActionEvent ev) {
String conversion = ev.getActionCommand(); if(conversion.equals("Ptas >> Euros")){ float nptas = (Float.valueOf(qpesetas.getText())).floatValue(); qeuros.setText(Float.toString(nptas/p1E)); showStatus("Ptas >> Euros"); // Surt a la barra d'estat del WB } else if(conversion.equals("Euros >> Ptas")){ float neuros = (Float.valueOf(qeuros.getText())).floatValue(); qpesetas.setText(Float.toString(neuros*p1E)); showStatus("Euros >> Ptas"); } else if(conversion.equals("Sortir")){ showStatus(getParameter("next_page"));// getParameter retorna el try { URL next_page = new URL(getParameter("next_page")); getAppletContext().showDocument(next_page); //valor del paràmetre } catch(Exception e) { showStatus("Error"); } // "next_page” de } //la pàgina euroConversor.html } // Fi del mètode actionPerformed }

35 EuroConversor: Sumari
euroConversor.html: amb el TAG <applet> “hostatgem” l’applet code=“EuroConvesor.class” la localització del “territori applet” vé determinada per la posició del TAG dins la pàgina mida del territori: height i width paràmetres: <param name=“…” value=“…”>

36 EuroConversor: Sumari II
euroConversor.java: Només hem redefinit el mètode init(): Definir/Visualitzar elements visuals Assignar un listener als botons start(), stop(), destroy(): no fan falta Implementa el mètode actionPerformed Interacció amb el Web Browser: getParameter: Obtenir paràmetres de HTML showStatus: Mostrar missatges a la statusbar getAppletContext().showDocument: per canviar de pàgina

37 Threads: Programes Multitasques
Procés: programa amb execució independent i espai propi de memòria Thread: flux seqüencial simple de procés Multitasca: execució alhora de dues o més tasques. 1CPU: Repartir temps CPU o reusar temps morts.1procés=>Nflux NCPU: multitasca real,1procés=>1flux

38 Threads (i II) Mètode run(): defineix activitat principal. Potser: no daemon: per defecte. daemon: execució en background de tasques annexes al programa. Comprovació continua si l'usuari prem un botó.

39 Programa amb un o dos threads

40 Crear Threads Dues formes: Estendre java.lang.Thread i sobrecarregar el mètode run(). Implementar la interfície java.lang.Runnable que declari el mètode run(). Crear un Thread passant- li un objecte de la nova classe Runnable. El més senzill és heretar de Thread. Si la classe ja hereta d'altra, s'ha d'implementar Runnable.

41 Estendre Thread public class SimpleThread extends Thread {
public SimpleThread (String str) { super(str); } // redefinir mètode run() public void run() { for(int i=0;i<10;i++) System.out.println("Aquest és el thread : " + getName()); } Executar: Crear objecte SimpleThread i cridar al mètode start(),heretat de Thread, que crida a run(). SimpleThread miThread = new SimpleThread(“FluxProva”); miThread.start();

42 Implementar Runnable public class SimpleRunnable implements Runnable {
String nameThread; public SimpleRunnable (String str) { nameThread = str; } public void run() { for(int i=0;i<10;i++) System.out.println("Aquest és el thread: " + nameThread); } Execució: SimpleRunnable p = new SimpleRunnable("FluxProva"); // Crear Thread passant-li objecte Runnable Thread miThread = new Thread(p); miThread.start();

43 Applets i Threads Problema: applets hereten Applet =>no poden heretar Thread => Implementar Runnable class ThreadRunnable extends Applet implements Runnable { private Thread runner=null; public void start() { if (runner == null) {runner = new Thread(this); runner.start(); } } public void stop(){ runner = null; } A on this es l'objecte Runnable

44 Cicle de vida d'un Thread

45 Estats del cicle de vida
1.New: Creat i no inicialitzat. No executat start(). Llença IllegalThreadStateException. 2.Runnable: Té assignat el temps de CPU. 3.Blocked o Not Runnable: Alguna activitat interna impedeix que s'executi. 4. Dead: S'ha finalitzat el mètode run().

46 Executar un nou thread Mètode start(): Si no llença IllegalThreadStateException. Crida a run(). El thread passa a Runnable, comparteix el temps de CPU, i quan el té està en Running

47 Aturar un thread temporalmente
Runnable: mètode yield() Renunciar voluntariament al temps CPU. Activitats monopolitzen la CPU. Not Runnable: aturar o bloquejar tmp Mètode sleep(): atura temps preestablert. Mètode wait(): Espera notify() notifyAll() Operacions d'Entrada/Sortida Crida a mètode synchronized bloquejat. Pas de Not Runnable a Runnable: Quan cessa la causa del bloqueig Crida a notify() o notifyAll().

48 Mètode sleep() Declaracions: public static void sleep(long millis) throws InterruptedException public static void sleep(long millis, int nanos) throws InterruptedException Paràmetres: temps aturat en milisegons (Opc) temps adiccional en nanosegons Pot llençar InterruptedException.

49 Exemple sleep() System.out.println ("Contar segons"); int count=0; public void run () { try { sleep(1000); System.out.println(count++); } catch (InterruptedException e){} }

50 Mètodes wait() i notifyAll()
Allibera el bloqueig de l'objecte Capçaleres: public final void wait() throws InterruptedException public final void wait(long timeout) throws InterruptedException public final void wait(long timeout, int nanos) throws InterruptedException Permet indicar el temps màxim aturat Si wait() i notify() no synchronized, llença IllegalMonitorStateException.

51 Finalitzar un thread Quan el mètode run() retorna el control Exemple d'Applet Runnable: AppletThread és el thread que executa el mètode run() MyApplet. Per finalitzar el thread cal posar la referencia AppletThread a null. mètode isAlive(): està viu o no true: Inicialitzat i no aturat false: No inicialitzat o finalitzat.

52 Exemple: Finalitzar Applet Runnable
public class MyApplet extends Applet implements Runnable { private Thread AppletThread; // referència tipus Thread ... public void start() { // mètode start() del Applet if(AppletThread == null){ // no té associat un objecte Thread AppletThread = new Thread(this, "El propi Applet"); AppletThread.start(); // arrenca el thread i crida a run() } } public void stop() { // mètode stop() del Applet AppletThread = null; // iguala la referència a null } public void run() { // mètode run() per implementar Runnable Thread myThread = Thread.currentThread(); while (myThread == AppletThread) { // fins stop() de Thread ... // codi a executar } } } // fi de la classe MyApplet

53 Sincronització Casos d'us Seccions crítiques (critical sections). Accés alhora a un recurs Productor-Consumidor

54 Modificador Synchronized()
mètode que accedeix a recursos compartits sense interferències Variable compartida:private o protected Exemple: public synchronized void metodoSincronizado() { ...// accedir per exemple a les variables d'un objecte }

55 Nivell de bloqueig d'objectes: Tots els mètodes son synchronized Pot executar diversos threads a diversos objectes d'una mateixa classe. de classes: Tots els mètodes i variables son static mètode synchronized static: Bloquejar tots els objectes d'una classe.

56 Alliberar Bloquig de Recurs
Usar wait(). unObjeto.notify(): llença una senyal d'activació d'un dels fluxes bloquejats per al recurs unObjeto. notifyAll() ho fa per a tots els fluxos que l'esperen. Han de ser cridats des del fluxos que té bloquejat l'objecte.

57 Exemple: Classe sincronitzada (get)
public synchronized int get() { while (available == false) { try { // Espera que put() assigni valor i cridi notify() wait(); } catch (InterruptedException e) { } } available = false; // notifica que el valor ha estat llegit notifyAll(); // retorna el valor return contents;

58 Exemple: Classe sincronitzada (put)
public synchronized void put(int value) { while (available == true) { try { // Espera que get() llegeixi el valor wait(); } catch (InterruptedException e) { } } // ofereix un nou valor i ho declara disponible contents = value; available = true; // notifica que el valor ha canviat notifyAll(); El bucle while de la función get() continúa ejecutándose (avalaible == false) hasta que el método put() haya suministrado un nuevo valor y lo indique con avalaible = true. En cada iteración del while la función wait() hace que el hilo que ejecuta el método get() se detenga hasta que se produzca un mensaje de que algo ha sido cambiado (en este caso con el método notifAll() ejecutado por put()). El método put() funciona de forma similar.

59 No es necessari bloquejar l'objecte fins el final del mètode.
Bocins de codi No es necessari bloquejar l'objecte fins el final del mètode. Exemple: sincronizar el propio thread public void run() { while(true) { ... syncronized(this) { // objecte a sincronitzar el propi thread ... // Codi sincronitzat } try { sleep(500); // S'atura el thread 0.5 segons però l'objecte // es accessible per altres threads } catch(InterruptedException e) {}

60 Readquirir el bloqueig
public class VolverAAdquirir { public synchronized void a() { b(); System.out.println("Sóc a()"); } public synchronized void b() { System.out.println("Sóc b()"); Sortida: Sóc b() Sóc a()

61 Prioritats Correcta execució d'un programa Repartir més eficient Donar més recursos S'hereta del thread que la inicialitzat. Variable membre de Thread. Per defecte NORM_PRIORITY (5). Entre MAX_PRIORITY (10) i MIN_PRIORITY (1) Mètodes getPriority() i setPriority()

62 Grups de Threads Tot thread pertany a un ThreadGroup. Manejar threads com un solo objecte. No es pot modificar l'associació Al arrencar un programa, el sistema crea un ThreadGroup nomenat main. Per defecte al crear un thread aquest pertany al grup del seu pare, quan no s'especifica. Si al programa no es crea cap ThreadGroup adicional, seràn del main.

63 Exemple de ThreadGroups

64 Operacions amb ThreadGroups
Assignar un grup al crear: public Thread (ThreadGroup grup, Runnable desti) public Thread (ThreadGroup grup, String nom) public Thread (ThreadGroup grup,Runnable desti String nom) Crear ThreadGroups ThreadGroup(ThreadGroup parent, String name); ThreadGroup(String name);


Descargar ppt "Curs Programació Java: Sessió 8"

Presentaciones similares


Anuncios Google