complementos de programação e algoritmos -- licenciatura...

24

Upload: others

Post on 27-Sep-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Concorrencia

I Concorrencia em JavaI MultiThreadingI sincroniza�c~aoI interface RunnableI grupos de threadsI exemplos

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 2: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

A classe Thread (java.lang)

Os threads s~ao dependentes da plataforma. Correm por quantum de tempo emWindows e em modo preemptive no Solaris.Escalonador privilegia as prioridades (entre 0 e 10) mais elevadas. Podemcorrer em modo daemon.

I construtores: Thread(String nome), Thread(Runnable obj), ...I m�etodo run() onde existe o c�odigo do thread

I m�etodo start() inicia o thread e terminaI static sleep(long MiliSegundos) coloca o thread no estado sleep

I m�etodo interrupt()I m�etodos suspend() / resume()I m�etodo stop() termina um thread (n~ao �e muito usado)

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 3: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Estados de um thread

I ready | pronto a executar quando houver 1 CPU

I running | em execu�c~ao

I suspended | activ�avel com chamada a resume()

I blocked | �a espera de uma opera�c~ao E/S

I sleeping | sem executar por um per��odo pr�e-determinado

I waiting

I dead | terminou a sua execu�c~ao

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 4: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Threads

do livro \Java How to Program", Deitel & DeitelRui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 5: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Threads

{ exemplo simples {

class PrintThread extends Thread fint sleepTime;

public PrintThread() f// sleep between 0 and 5 secondssleepTime = (int) ( Math.random() * 5000 );System.out.println( "Name: " + getName() +

"; sleep: " + sleepTime );g

public void run() ftry f

Thread.sleep( sleepTime ); // put thread to sleep for a random intervalSystem.out.println(\Dormi durante \+sleepTime+" segundos. Ate ja.");

gcatch (InterruptedException exception) f

System.err.println(exception.toString());g

System.out.println(getName());g

g

exemplo do livro \Java How to Program", Deitel & Deitel

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 6: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Threads

{ exemplo simples {

public class PrintTest f // Show multiple threads printing at di�erent intervals.public static void main(String args[])f

PrintThread thread1, thread2, thread3, thread4;

thread1 = new PrintThread();thread2 = new PrintThread();thread3 = new PrintThread();thread4 = new PrintThread();thread1.start();thread2.start();thread3.start();thread4.start();

gg

exemplo do livro \Java How to Program", Deitel & Deitel

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 7: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Sincroniza�c~ao

I Uso de monitors (C.A. Hoare)

I Cada objecto com um m�etodo synchronized �e um monitor

I O monitor deixa um s�o thread de cada vez correr um m�etodosynchronized no objecto

I todos os threads que tentam invocar um m�etodo synchronizednum objecto locked tem que esperar

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 8: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Sincroniza�c~ao (cont.)

I quando um m�etodo synchronized termina o monitor levanta o locke o thread ready com maior prioridade pode invocar o m�etodosynchronized que pretende

I m�etodo synchronized que ve que n~ao pode executar chama wait eespera numa �la

I outro m�etodo pode reactivar o m�etodo auto-suspendidonoti�cando-o (notify) que pode voltar a correr

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 9: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Threads (produtor/consumidor), sem sincroniza�c~ao

public class SharedCell fpublic static void main(String args[])fHoldInteger h = new HoldInteger();ProduceInteger p = new ProduceInteger(h);ConsumeInteger c = new ConsumeInteger(h);

p.start();c.start();

gg

class ProduceInteger extends Threadfprivate HoldInteger pHold;

public ProduceInteger(HoldInteger h)fpHold = h;

g

public void run()ffor(int count = 0; count < 10; count++)fpHold.setSharedInt(count);System.out.println("Producer set sharedInt: "+ count);try fThread.sleep((int) (Math.random() * 3000));

gcatch(InterruptedException e) fSystem.err.println(e.toString());

ggpHold.setMoreData(false);

gg

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 10: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Threads (produtor/consumidor)(cont.)sem sincroniza�c~ao

class ConsumeInteger extends Thread fprivate HoldInteger cHold;

public ConsumeInteger(HoldInteger h)fcHold = h;

gpublic void run()fint val;

while(cHold.hasMoreData())ftryf Thread.sleep((int) (Math.random() * 3000));gcatch(InterruptedException e)fSystem.err.println(e.toString());

gval = cHold.getSharedInt();System.out.println( "Consumer retrieved " + val );

gg

g

class HoldIntegerfprivate int sharedInt = -1;private boolean moreData = true;

public void setSharedInt(int val)fsharedInt = val;

gpublic int getSharedInt()freturn sharedInt;

gpublic void setMoreData(boolean b)fmoreData = b;

gpublic boolean hasMoreData()freturn moreData;

gg

do livro \Java How to Program", Deitel & Deitel

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 11: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Resultado

# java SharedCellProducer set sharedInt to 0Producer set sharedInt to 1Consumer retrieved 1Producer set sharedInt to 2Consumer retrieved 2Producer set sharedInt to 3Producer set sharedInt to 4Consumer retrieved 4Consumer retrieved 4Producer set sharedInt to 5Producer set sharedInt to 6Consumer retrieved 6Producer set sharedInt to 7Consumer retrieved 7Producer set sharedInt to 8Consumer retrieved 8Consumer retrieved 8Consumer retrieved 8Producer set sharedInt to 9Consumer retrieved 9Consumer retrieved 9Consumer retrieved 9

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 12: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Threads (produtor/consumidor), com sincroniza�c~ao

// Do exemplo anterior s�o HoldInteger �e diferente.class HoldInteger fprivate int sharedInt = -1;private boolean moreData = true;//monitor's condition variableprivate boolean writeable = true;

public synchronized void setSharedInt(int val)fwhile(!writeable)ftry f wait(); gcatch(InterruptedException e)fSystem.err.println("Exception: " + e.toString());g

gsharedInt = val;writeable = false;notify();

gpublic synchronized int getSharedInt()fwhile( writeable ) ftry f wait(); gcatch(InterruptedException e)fSystem.err.println("Exception: " + e.toString());

gg

writeable = true;notify();return sharedInt;

gpublic void setMoreData(boolean b)f moreData = b; gpublic boolean hasMoreData()f return moreData;g

g

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 13: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Resultado

# java SharedCellProducer set sharedInt to 0Consumer retrieved 0Producer set sharedInt to 1Consumer retrieved 1Producer set sharedInt to 2Consumer retrieved 2Producer set sharedInt to 3Consumer retrieved 3Producer set sharedInt to 4Consumer retrieved 4Producer set sharedInt to 5Consumer retrieved 5Producer set sharedInt to 6Consumer retrieved 6Producer set sharedInt to 7Consumer retrieved 7Producer set sharedInt to 8Consumer retrieved 8Producer set sharedInt to 9Consumer retrieved 9

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 14: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Bu�er circular

import java.applet.Applet;import java.awt.*;import java.text.DecimalFormat;

public class SharedCell extends Appletfprivate TextArea output;

public void init()fsetLayout(new BorderLayout());output = new TextArea();add(output, BorderLayout.CENTER);

g

public void start()fHoldInteger h = new HoldInteger(output);ProduceInteger p = new ProduceInteger(h);ConsumeInteger c = new ConsumeInteger(h);

p.start();c.start();

gg

class ProduceInteger extends Threadf... igual ao exemplo anterior ...

g

class ConsumeInteger extends Threadf... igual ao exemplo anterior ...

g Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 15: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Bu�er circular

class HoldIntegerfprivate int sharedInt[] = f -1, -1, -1, -1, -1 g;private boolean moreData = true;private boolean writeable = true;private boolean readable = false;private int readLoc = 0, writeLoc = 0;private TextArea output;

public HoldInteger(TextArea out)foutput = out;gpublic synchronized void setSharedInt(int val)fwhile( !writeable) ftry foutput.append(" WAITING TO PRODUCE "+val);wait();gcatch(InterruptedException e)fSystem.err.println(e.toString());ggsharedInt[writeLoc] = val;readable = true;output.append("nnProduced " + val +

" into cell " + writeLoc);writeLoc = (writeLoc + 1) % 5;output.append("ntwrite "+writeLoc+"ntread "+readLoc);printBu�er(output, sharedInt);if(writeLoc == readLoc)fwriteable = false;output.append("nnBUFFER FULL");gnotify();g

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 16: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Bu�er circular

public synchronized int getSharedInt()fint val;

while(!readable)ftry foutput.append( " WAITING TO CONSUME" );wait();gcatch ( InterruptedException e ) fSystem.err.println( e.toString() );

ggwriteable = true;val = sharedInt[readLoc];output.append("nnConsumed " + val +

" from cell " + readLoc);readLoc = (readLoc + 1) % 5;output.append( "ntwrite " + writeLoc +

"ntread " + readLoc);printBu�er(output, sharedInt);

if(readLoc == writeLoc)freadable = false;output.append("nnBUFFER EMPTY");

gnotify();return val;

g

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 17: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Bu�er circular

public void printBu�er( TextArea out, int buf[])fDecimalFormat threeChs = new DecimalFormat(" #;-#");output.append("ntbu�er: ");

for(int i = 0; i < buf.length; i++)out.append(" " + threeChs.format(buf[i]));g

public void setMoreData(boolean b)fmoreData = b;g

public boolean hasMoreData()fif (moreData == false && readLoc == writeLoc)return false;else return true;gg

exemplo do livro \Java How to Program", Deitel & Deitel

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 18: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Threads Daemon

I s~ao executados para benef��cio de outros threads

I correm em background

I tornar um thread em daemon: setDaemon(true)

I a propriedade daemon tem que ser activada antes do m�etodo start()

I se s�o existirem daemons o Java termina

I ex: garbage collection

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 19: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Interface Runnable

I usar a classe Thread implica heran�ca dessa classe

I multithreading sem heran�ca de Thread ! uso do interface Runnable

I declara�c~ao: class Classe implements Runnable

I c�odigo tamb�em guardado em run()

I cria�c~ao: Thread(Runnable object) ouThread(Runnable object, String threadName)

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 20: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Interface Runnable{ exemplo {

import java.applet.Applet;import java.awt.*;import java.awt.event.*;

public class RandomCharacters extends Appletimplements Runnable, ActionListener f

private String alphabet;private TextField output1, output2, output3;private Button button1, button2, button3;private Thread thread1, thread2, thread3;private boolean suspend1, suspend2, suspend3;

public void init()falphabet = new String( "ABCD...YZ");output1 = new TextField(10);output1.setEditable(false);output2 = new TextField(10);output2.setEditable(false);output3 = new TextField(10);output3.setEditable(false);button1 = new Button("Suspend/Resume 1");button1.addActionListener(this);button2 = new Button("Suspend/Resume 2");button2.addActionListener(this);button3 = new Button("Suspend/Resume 3");button3.addActionListener(this);add(output1);add(button1);add(output2);add(button2);add(output3);add(button3);

g

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 21: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Interface Runnable{ exemplo (cont.) {

public void start()f// create threads and start every time start is calledthread1 = new Thread(this, "Thread 1");thread2 = new Thread(this, "Thread 2");thread3 = new Thread(this, "Thread 3");

thread1.start();thread2.start();thread3.start();

gpublic void stop()f

// stop threads every time stop is called// as the user browses another Web pagethread1.stop();thread2.stop();thread3.stop();

g

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 22: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Interface Runnable{ exemplo (cont.) {

public void actionPerformed(ActionEvent e)fif(e.getSource() == button1)

if(suspend1)fthread1.resume();suspend1 = false;

gelse fthread1.suspend();output1.setText("suspended");suspend1 = true;

gelse if (e.getSource() == button2)

if (suspend2) fthread2.resume();suspend2 = false;

gelse f

thread2.suspend();output2.setText("suspended");suspend2 = true;

gelse if (e.getSource() == button3)

if (suspend3) fthread3.resume();suspend3 = false;

gelse f

thread3.suspend();output3.setText("suspended");suspend3 = true;

gg

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 23: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Interface Runnable{ exemplo (cont.) {

public void run()fint location;char display;Thread executingThread;

while (true) f// sleep from 0 to 5 secondstry fThread.sleep((int) (Math.random() * 3000));

gcatch (InterruptedException e) fe.printStackTrace();

g

location = (int) (Math.random() * 26);display = alphabet.charAt(location);executingThread = Thread.currentThread();if (executingThread == thread1)output1.setText("Thread 1: " + display);

else if (executingThread == thread2)output2.setText("Thread 2: " + display);

else if (executingThread == thread3)output3.setText("Thread 3: " + display);

gg

g

exemplo do livro \Java How to Program", Deitel & DeitelRui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 24: Complementos de Programação e Algoritmos -- Licenciatura ...rcamacho/cadeiras/cpa/acetatos/threads.pdf · ao c~ Apresenta Java { conceitosasicos B Java opicos{ cos t esp ec Estados

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Grupos de Threads

I classe ThreadGroup permite formar grupos de threads

I podem existir subclasses de grupos de threads

I realizar a mesma ac�c~ao para todos os elementos do grupo e gruposdas subclassses

I cada grupo �e identi�cado por um nome (String)

I contruir um grupo: ThreadGroup(String nome)

I contruir um grupo descendente: ThreadGroup(ThreadGroup pai,String nome)

I associar um thread a um grupo:public Thread(ThreadGroup grupo, String threadName)public Thread(ThreadGroup grupo, Runnable obj)

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC