Derig Almeida Vidal, MSc. Mestre em Computação Aplicada, Engenheiro
de Produção e Tecnólogo em Automática
Prof. Derig Almeida Vidal, MSc.
SISTEMAS MONOTAREFA
• O usuário executa apenas um aplicativo de cada vez.
• Permite que o processador, a memória, e os periféricos fiquem dedicados a um único usuário;
• Problemas:
Enquanto o programa aguarda um evento o processador fica ocioso;
A memória é subutilizada;
Os periféricos estão dedicados a um único usuário.
SISTEMAS MONOTAREFA SISTEMAS MULTITAREFAS
• Possibilita uma melhor utilização:
Do processador;
Da memória; e,
Prof. Derig Almeida Vidal, MSc.
SISTEMAS MULTITAREFAS
• No sistema multiprogramado diversos programas são mantidos na memória ao mesmo tempo.
• Estes vários programas são executados simultaneamente*.
• Um único programa não ocupa toda a memória e não ocupa todo o tempo do processador.
Prof. Derig Almeida Vidal, MSc.
O QUE É UM PROGRAMA?
• É uma coleção de instruções que descrevem uma tarefa a ser realizada por um
computador.
• O termo pode ser uma referência ao código fonte, escrito em alguma linguagem de programação, ou ao arquivo que contém a forma executável deste código fonte. • Ex:
main() { int f1, f2;
printf(“Alo mundo\n”); }
O QUE É UM PROCESSO?
• Processo é um programa em execução. • É a forma pela qual o Sistema Operacional
“enxerga” um programa e possibilita a sua execução.
• É possível que vários processos executem o mesmo programa ao mesmo tempo.
Ou seja, um programa pode ter várias instâncias em execução.
Mesmo código (programa) porém dados e momentos de execução (contexto) diferentes.
O QUE É UM PROCESSO?
• O processo envolve uma série de atributos, O processo envolve uma série de atributos, O processo envolve uma série de atributos, O processo envolve uma série de atributos, como:
como:como: como:
Espaço de endereçamento
Descritores de arquivos abertos
Permissões de acesso
Área de código
Dados
Pilha de Execução
Prof. Derig Almeida Vidal, MSc.
E ENTÃO, O QUE É A THREAD? • É um fluxo de execução.
• Na maior parte das vezes, cada processo é formado por um conjunto de recursos mais uma única thread.
Prof. Derig Almeida Vidal, MSc.
E A MULTITHREADING?
• Ela associa vários fluxos de execução a um único processo.
E A MULTITHREADING?
• Threads de um mesmo processo compartilham:
Recursos
Espaço de endereçamento
Código
Dados
• Definir um novo processo envolve alocação de recursos do SO.
• Definir uma nova Thread envolve definir uma nova pilha e um novo contexto de execução dentro do processo já existente (ou seja é mais leve).
POR QUE UTILIZAR A MULTITHREADING? • Programas concorrentes que utilizam
múltiplos threads são mais rápidos do que implementados como múltiplos
(sub)processos.
• Pode melhorar o desempenho da aplicação apenas executando tarefas secundárias (background), enquanto outras operações estão sendo processadas.
• Ex: editores de texto, planilhas, aplicativos gráficos e processadores de imagens.
Prof. Derig Almeida Vidal, MSc.
POR QUE UTILIZAR A MULTITHREADING?
• Em ambientes distribuídos, as threads são
essenciais para solicitações de serviços
remotos.
Uma thread pode solicitar o serviço
remoto, enquanto a aplicação pode
continuar realizando outras atividades
úteis.
Já para o processo que atende a
solicitação, múltiplos threads permitem
que diversos pedidos sejam atendidos
concorrentemente e/ou simultaneamente.
Prof. Derig Almeida Vidal, MSc.
ESTADOS DA THREAD
EXEMPLO 01
import java.util.Calendar; import javax.swing.*;
class ThreadDemo extends JFrame { JLabel label;
public ThreadDemo(String title) { super(title);
label = new JLabel("Iniciando o relógio");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.add(label); this.setSize(300, 300); this.setVisible(true); } EXEMPLO 01
private void startCount() { try { while (true) { Thread.sleep(1000); Thread.sleep(1000); Thread.sleep(1000); Thread.sleep(1000);
Calendar agora = Calendar.getInstance(); // horas, minutos e segundos
int horas = agora.get(Calendar.HOUR); int minutos = agora.get(Calendar.MINUTE); int segundos = agora.get(Calendar.SECOND);
String horaCerta = "Hora Atual: " + String.valueOf(horas) + ":" + String.valueOf(minutos) + ":" +
String.valueOf(segundos); label.setText(horaCerta);
Prof. Derig Almeida Vidal, MSc.
EXEMPLO 01
}
} catch (InterruptedException ie) { }
label.setText(Thread.currentThread().toString()); }
public static void main(String args[]) {
ThreadDemo minhaThread = new ThreadDemo("Interface gráfica do relógio");
minhaThread.startCount(); }
}
Prof. Derig Almeida Vidal, MSc.
HERANÇA DA CLASSE THREAD
• No caso do exemplo anterior existia apenas uma única thread que era pausada por um determinado período e depois atualizava a hora, repetindo diversas vezes devido ao loop.
• Pode-se estender da classe thread e modificar seus métodos, bem como criar e executar várias threads ao mesmo tempo.
• Vejamos o exemplo nos slides a seguir.
HERANÇA (ESTENDENDO) DA CLASSE THREAD
• Agora vamos testar criar várias threads e modificar alguns de seus métodos:
class ThreadDemo extends Thread { public ThreadDemo(String name) {
super(name); start(); } public void run() {
for (int i = 0; i < 100; i++) {
System.out.print(getName()); } } public static void main(String args[]) {
ThreadDemo pnt1 = new ThreadDemo("A"); ThreadDemo pnt2 = new ThreadDemo("B"); ThreadDemo pnt3 = new ThreadDemo("C"); ThreadDemo pnt4 = new ThreadDemo("D"); }}
HERANÇA (ESTENDENDO) DA CLASSE THREAD
• Agora modifique o método run() para: for (int i = 0; i < 100; i++) {
System.out.println(getName()); try {
Thread.sleep(500); //Faz a thread dormir por 500 ms
} catch (InterruptedException ex) {
Logger.getLogger(ThreadDemo.class.getName()).log( Level.SEVERE, null, ex);
} }
Prof. Derig Almeida Vidal, MSc.
ESTENDENDO A CLASSE THREAD E
ADICIONANDO UMA INTERFACE RUNNABLE
• Em Java, usamos a classe Thread do pacote java.lang para criarmos linhas de
execução paralelas. A classe Thread recebe como argumento um objeto com o código que desejamos rodar.
• Para que isso seja possível, deve haver uma forma que determine o seu comportamento. Isso é obtido pela interface Runnable.
• Através dela informamos que A nossa classe é "executável" e que segue determinado
comportamento. Na interface Runnable, há apenas um método chamado run. Basta implementá-lo e a classeThread já saberá executar nossa classe.
Prof. Derig Almeida Vidal, MSc.
EXEMPLO
public class GeraPDF implements Runnable { public void run () { // lógica para gerar o pdf... } }
public class BarraDeProgresso implementsimplementsimplementsimplements RunnableRunnableRunnableRunnable { public void run () { // mostra barra de progresso e vai atualizando ela... } } public class MeuPrograma {
public static void main (String[] args) { GeraPDF gerapdf = new GeraPDF(); Thread threadDoPdf = newnewnewnew ThreadThreadThread(gerapdf); Thread threadDoPdf.start();start();start();start();
BarraDeProgresso barraDeProgresso = new BarraDeProgresso();
Thread threadDaBarra = new Thread(barraDeProgresso); threadDaBarra.start();
} }
COMPARTILHANDO VARIÁVEIS
• Declare na classe principal:
public static int contadorPublico = 0;
• Modifique o método run() para:
int contadorPrivado = 0;
for (int i = 0; i < 100; i++) {
System.out.println(getName()+" - Contador Público = "+contadorPublico+ " - Contador Privado = "+contadorPrivado);
contadorPrivado++; contadorPublico++;
try { ...
BIBLIOGRAFIA
• Curso JEDI JAVA. Disponível em: <http://www.dfjug.org/jedi/index.jsp>
• Osmar J. Silva. Obter a hora atual. Disponível em: <http://www.arquivodecodigos.net/dicas/java-obter-a-hora-atual-51.html>
• Caelum. Programação Concorrente e Threads. <http://www.caelum.com.br/apostila-java-orientacao-objetos/programacao-concorrente-e-threads/>