Em uma explicação simples de entender, o que é Runnable em Java? [fechadas]

92

O que é "executável" em Java, em termos gerais? Eu sou um estudante de programação AP no colégio, cuja tarefa é fazer pesquisa ou buscar de outros o que é "executável" (estamos apenas entrando em OOP e não tocamos nos tópicos ainda).

user1809295
fonte
Há apenas uma linha útil nos documentos da API: "O contrato geral do método executado é que ele pode realizar qualquer ação."
Tom Hawtin - tackline
Uma tarefa de pesquisa muito mais interessante teria sido: O que é "parável" em Java, em termos leigos. Os instrutores de hoje são tão ...
Udo Klimaschewski
8
@UdoKlimaschewski - o cara é um estudante do ensino médio , não um estudante de graduação ou pós-graduação. As expectativas deste instrutor são proporcionais ao nível do aluno ... IMO. No entanto, concordo que "primeiro pergunte no SO" NÃO é uma técnica de pesquisa adequada para alguém no nível do OP.
Stephen C

Respostas:

188

Um Runnable é basicamente um tipo de classe (Runnable é uma Interface) que pode ser colocada em um thread, descrevendo o que o thread deve fazer.

A Interface Executável requer que a classe implemente o método da seguinte run()maneira:

public class MyRunnableTask implements Runnable {
     public void run() {
         // do stuff here
     }
}

E então use-o assim:

Thread t = new Thread(new MyRunnableTask());
t.start();

Se você não tivesse a Runnableinterface, a classe Thread, que é responsável por executar suas coisas na outra thread, não teria a promessa de encontrar um run()método em sua classe, então você poderia obter erros. É por isso que você precisa implementar a interface.

Avançado: tipo anônimo

Observe que você não precisa definir uma classe como de costume, você pode fazer tudo isso inline:

Thread t = new Thread(new Runnable() {
    public void run() {
        // stuff here
    }
});
t.start();

Isso é semelhante ao anterior, só que você não cria outra classe nomeada.

opatut
fonte
67
Esta é uma grande resposta que refuta inteiramente a afirmação de que a pergunta "não pode ser razoavelmente respondida em sua forma atual".
Russell Silva
1
Eu sei que já faz muito tempo, mas tenho uma pergunta. O thread é executado apenas uma vez ou continua executando continuamente dentro do programa quando eu inicio um thread?
gamo
5
O thread é executado até que o runmétodo seja concluído e, em seguida, o Thread é fechado. Se você quiser que um thread seja executado repetidamente, coloque um loop dentro do runmétodo.
opatut
2
Ou simplesmente usando uma função lambda do Java 8:new Thread(() -> System.out.println("hello from other thread")).start();
Gabe
9

Runnable é uma interface definida como:

interface Runnable {
    public void run();
}

Para fazer uma classe que o usa, basta definir a classe como (public) class MyRunnable implements Runnable {

Ele pode ser usado mesmo sem fazer um novo Thread. É basicamente sua interface básica com um único método, run, que pode ser chamado.

Se você criar um novo Thread com runnable como parâmetro, ele chamará o método run em um novo Thread.

Deve-se notar também que Threads implementam Runnable, e isso é chamado quando o novo Thread é feito (no novo thread). A implementação padrão apenas chama qualquer Runnable que você entregou no construtor, e é por isso que você pode simplesmente fazer new Thread(someRunnable)sem substituir o runmétodo de Thread .

Alex Coleman
fonte
Você está dizendo que basicamente não há diferença entre herdar Thread ou implementar Runnable? O Thread ao usar o Runnable é usado como um invólucro, bem como o executor?
opatut
Estou dizendo que não há diferença entre [extender Thread e substituir a execução] e [criar uma nova instância de Thread com um executável que tem o mesmo método de execução]
Alex Coleman
Sim, entendi. Mas realmente não há diferença, nem desempenho - nem de outra forma?
opatut
3
@AlexColeman - há uma grande diferença. Se você estender o Threadpool de threads é difícil e se você não implementar o pool de threads, você terá um custo significativo de criar novas threads o tempo todo. Por outro lado, apenas implementar Runnablesignifica que você pode usar facilmente coisas como ThreadPoolExecutorServiceum pool de threads de terceiros.
Stephen C