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).
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:
publicclassMyRunnableTaskimplementsRunnable{publicvoid run(){// do stuff here}}
E então use-o assim:
Thread t =newThread(newMyRunnableTask());
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 =newThread(newRunnable(){publicvoid run(){// stuff here}});
t.start();
Isso é semelhante ao anterior, só que você não cria outra classe nomeada.
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:
interfaceRunnable{publicvoid 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 .
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.
Respostas:
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:E então use-o assim:
Se você não tivesse a
Runnable
interface, a classe Thread, que é responsável por executar suas coisas na outra thread, não teria a promessa de encontrar umrun()
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:
Isso é semelhante ao anterior, só que você não cria outra classe nomeada.
fonte
run
método seja concluído e, em seguida, o Thread é fechado. Se você quiser que um thread seja executado repetidamente, coloque um loop dentro dorun
método.new Thread(() -> System.out.println("hello from other thread")).start();
Runnable
é uma interface definida como: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 fazernew Thread(someRunnable)
sem substituir orun
método de Thread .fonte
Thread
pool 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 implementarRunnable
significa que você pode usar facilmente coisas comoThreadPoolExecutorService
um pool de threads de terceiros.