Java/Thread: diferenças entre revisões

92 bytes adicionados ,  28 de julho de 2016
 
==Criando threads==
Para criar sua própria ''thread'' por meio da classe <code>Thread</code>, é preciso realizar 3 etapas: Definir o código a ser executado pela ''thread'', referenciar esse código em uma instância de <code>Thread</code> e chamar o método <code>void start()</code> dessa classe.
 
===Definindo o código===
<source lang="java">
O código que será executado por uma ''thread'' deve ser definido no método <code>void run()</code> da interface <code>[https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html java.lang.Runnable]</code>.
Thread()
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(String name)
</source>
 
O código executado por uma ''thread'' pode ser definido de duas formas: através de subclasse da classe <code>Thread</code> ou da implementação da interface <code>java.lang.Runnable</code>. Em ambos os casos as instruções devem estar inseridas no corpo do método <code>void run</code>.
 
<source lang="javaJava" highlight="1,4">
Os construtores que não especificam em sua lista de parâmetros variável do tipo <code>Runnable</code> devem ser chamados em uma subclasse de <code>Thread</code>.
class Executavel implements Runnable {
<source lang="java" highlight="4">
public class Segmento extends Thread {
 
public Segmento(String nome) {
super(nome);
}
 
@Override
public void run() {
System.out.println(Thread.currentThread());
// Código
}
}
</source>
 
Já que <code>Runnable</code> é uma interface funcional, é possível reescrever o código acima da seguinte forma.
 
<source lang="Java" highlight="1,4">
Runnable runnable = () -> System.out.println(Thread.currentThread());
</source>
 
===Instanciando a classe Thread===
Isso ocorre porque o método <code>void run</code> de <code>Thread</code> chama o método <code>void run</code> de sua variável <code>Runnable target</code>, caso <code>target</code> não seja uma referência nula.
<source lang="javaJava" highlight="5">
class EstudandoThreads {
 
public Segmentostatic void main(String[] nomeargs) {
Runnable runnable = () -> System.out.println(Thread.currentThread());
Thread thread = new Thread(runnable);
}
}
</source>
 
===Executando a thread===
<source lang="Java" line start=3 highlight="6">
class EstudandoThreads {
 
public static void main(String[] args) {
Runnable runnable = () -> System.out.println(Thread.currentThread());
Thread thread = new Thread(runnable);
thread.start();
}
}
</source>
Thread[Thread-0,5,main]
 
Na próxima seção será explicado o porquê de <code>Runnable</code> ser uma escolha melhor que <code>Thread</code> para definir o código a ser executado por uma ''thread''.
 
<code>String name</code> especifica um nome para a ''thread''. Caso não especificado no construtor o nome da ''thread'' será criado automaticamente derivado do modelo '''Thread-0''', onde '''0''' é um número incrementado a cada nova '''thread''' criada sem definição de nome.
 
 
 
===Evite ThreadGroup===
<source lang="Java">
Thread(ThreadGroup group, Runnable target)
 
<code>[https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadGroup.html java.lang.ThreadGroup] group</code> inclui a ''thread'' em um grupo de ''threads''. A utilização de <code>ThreadGroup</code> deve ser evitada<ref>Item 73 - JOSHUA, Bloch. Effective Java. 2.ª edição, 2009. </ref>.
 
===A interface Runnable===
A interface funcional <code>[https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html java.lang.Runnable]</code> especifica o método <code>void run()</code>. Esse método deverá conter o código a ser executado por uma ''thread''.
 
<source lang="java">
 
</source>
 
==Métodos estáticos==