Threads Java IFSP
Threads Java IFSP
Multitarefa e Multithreading
main
run
GC
Para que serve uma thread?
• Manter a capacidade de resposta de um
aplicativo durante uma tarefa longa.
• Permitir o cancelamento de tarefas
separáveis.
• Alguns problemas são intrinsecamente
paralelos.
• Monitorar o status de algum recurso (BD).
Aplicação de Thread
Threads
recém
criada
Thread executada
• New
• Runnable
• Running
• Not Runnable
– Bloqueada para E/S
– Esperando variável de condição
– Sleeping (dormindo)
• Dead
Estados de uma Thread
Thread State Diagram
Alive
Executando
new ThreadExample(); while (…) { … }
Blocked
Object.wait()
Thread.sleep()
Bloqueada IO call
Aguardando um monitor
Exemplo
public class PrintThread1 extends Thread {
String name;
public PrintThread1(String name) {
this.name = name;
}
public void run() {
for (int i=1; i<500 ; i++) {
try {
sleep((long)(Math.random() * 100));
} catch (InterruptedException ie) { }
System.out.print(name);
}}
Exemplo (cont)
public static void main(String args[]) {
PrintThread1 a = new PrintThread1("*");
PrintThread1 b = new PrintThread1("-");
PrintThread1 c = new PrintThread1("=");
a.start();
b.start();
c.start();
}
}
Agendamento
// construtor
public PrintTask(String taskName)
{
this.taskName = taskName;
// seleciona tempo de adormecimento aleatório entre 0 e 5 segundos
sleepTime = generator.nextInt(5000); // milissegundos
}
// método run contém o código que uma thread executará
public void run(){
try // coloca a thread para dormir pela quantidade de tempo sleepTime
{
System.out.printf("%s indo dormir por %d milliseconds.%n",taskName, sleepTime);
Thread.sleep(sleepTime); // coloca a thread para dormir
}
catch (InterruptedException exception)
{
exception.printStackTrace();
Thread.currentThread().interrupt(); // reinterrompe a thread
}
executorService.shutdown();
System.out.println("Tarefas finalizadas");
}
}
ExecutorService
Coloca peças
Como alternar Coloca peças
verdes as cores vermelhas
Monitores
syncronized (objeto)
{
}
Objeto é o que deve ser bloqueado pelo
monitor. Normalmente é o this. Caso
haja vários
Exemplo
deposita()
Conta Bancária
Deadlock
public class ContaBancaria {
// em algum lugar
Runnable transaction1 =
new Transferencia(anton, karl, 1200);
Thread t1 = new Thread(transaction1);
t1.start();
// em outro lugar
Runnable transaction2 =
new Transferencia(karl, anton, 700);
Thread t2 = new Thread(transaction2);
t2.start();
Deadlocks
t1 t2
anton karl
transfere() transfere()
?
saca() saca()
deposita() deposita()
Bloqueios Java são reentrantes
synchronized (lock) {
while (!resourceAvailable()) {
lock.wait();
}
consumeResource();
}
Produtor
produceResource();
synchronized (lock) {
lock.notifyAll();
}
Sequência Wait/Notify
Lock Object
1. synchronized(lock){ 3. produzRecurso()
2. lock.wait(); 4. synchronized(lock) {
5. lock.notify();
9. consomeRecurso();
6.}
10. } 7. Readquire lock
8. Retorna do wait()
Thread
Thread
Produtora
Consumidora
Sequência Wait/Notify
Lock Object
1. synchronized(lock){ 3. produzRecurso()
2. lock.wait(); 4. synchronized(lock) {
5. lock.notify();
9. consomeRecurso();
10. } 6.}
7. Readquire lock
8. Retorna do wait()
Thread Thread
Consumidora Produtora
Sequência Wait/Notify
Lock Object
1. synchronized(lock){ 3. produzRecurso()
2. lock.wait(); 4. synchronized(lock) {
9. consomeRecurso(); 5. lock.notify();
10. } 6.}
7. Readquire lock
8. Retorna do wait()
Thread Thread
Consumidora Produtora
Sequência Wait/Notify
Lock Object
1. synchronized(lock){ 3. produceResource()
2. lock.wait(); 4. synchronized(lock) {
5. lock.notify();
9. consomeRecurso();
10. 6.}
10. }} 7. Readquire
Reacquire lock
8.
8. Retorna
Return from
do wait()
wait()
Thread Thread
Consumidora Produtora
Sequência Wait/Notify
Lock Object
1. synchronized(lock){ 3. produceResource()
produzRecurso()
2. lock.wait();
lock.wait(); 4. synchronized(lock) {
5. lock.notify();
9. consomeRecurso();
consumeResource();
10. 6.}
10. }} 7. Readquire
Reacquire lock
8. Retorna
8. Return from wait()
do wait()
Thread Thread
Consumidora Produtora
Sequência Wait/Notify
Lock Object
1. synchronized(lock){ 3. produceResource()
produzRecurso()
2. lock.wait();
lock.wait(); 4. synchronized(lock) {
5. lock.notify();
9. consomeRecurso();
consumeResource();
10. 6.}
10. }} 7. Readquire
Reacquire lock
8.
8. Retorna
Return from
do wait()
wait()
Thread Thread
Consumidora Produtora
Sequência Wait/Notify
Lock Object
1. synchronized(lock){ 3. produceResource()
produzRecurso()
2. lock.wait();
lock.wait(); 4. synchronized(lock) {
5. lock.notify();
9. consomeRecurso();
consumeResource();
10. 6.}
10. }} 7. Readquire
Reacquire lock
8.
8. Retorna
Return from
do wait()
wait()
Thread Thread
Consumidora Produtora
Sequência Wait/Notify
Lock Object
1. synchronized(lock){ 3. produceResource()
produzRecurso()
2. lock.wait();
lock.wait(); 4. synchronized(lock) {
5. lock.notify();
9. consomeRecurso();
consumeResource();
10. 6.}
10. }} 7. Reacquire lock
8.
8. Retorna
Return from
do wait()
wait()
Thread Thread
Consumidora Produtora
Sequência Wait/Notify
Lock Object
1. synchronized(lock){ 3. produceResource()
produzRecurso()
2. lock.wait();
lock.wait(); 4. synchronized(lock) {
5. lock.notify();
9. consomeRecurso();
consumeResource();
10. 6.}
10. }} 7. Readquire
Reacquire lock
8. Return from wait()
Thread Thread
Consumidora Produtora
Sequência Wait/Notify
Lock Object
1. synchronized(lock){ 3. produceResource()
produzRecurso()
2. lock.wait();
lock.wait(); 4. synchronized(lock) {
5. lock.notify();
9. consumeResource();
10. 6.}
10. }} 7. Readquire
Reacquire lock
8.
8. Retorna
Return from
do wait()
wait()
Thread Thread
Consumidora Produtora
Sequência Wait/Notify
Lock Object
1. synchronized(lock){ 3. produceResource()
produzRecurso()
2. lock.wait();
lock.wait(); 4. synchronized(lock) {
5. lock.notify();
9. consomeRecurso();
consumeResource();
6.}
10. } 7. Readquire
Reacquire lock
8.
8. Retorna
Return from
do wait()
wait()
Thread Thread
Consumidora Produtora