Alguém pode me sugerir como eu posso passar um parâmetro para um thread?
Além disso, como funciona para classes anônimas?
java
multithreading
Steve
fonte
fonte
Consumer<T>
.Respostas:
Você precisa passar o parâmetro no construtor para o objeto Runnable:
e invoque-o assim:
fonte
r
terá o mesmo argumento; portanto, se quisermos passar argumentos diferentes para vários Threads em execuçãoMyThread
, precisaremos criar uma novaMyThread
instância usando o argumento desejado para cada Thread. Em outras palavras, para colocar um thread em funcionamento, precisamos criar dois objetos: Thread e MyThread. Isso é considerado ruim, em termos de desempenho?Para classes anônimas:
Em resposta às edições das perguntas, veja como funciona para classes anônimas
Classes nomeadas:
Você tem uma classe que estende o Thread (ou implementa Runnable) e um construtor com os parâmetros que deseja passar. Então, quando você cria o novo thread, precisa passar os argumentos e iniciar o thread, algo como isto:
Runnable é uma solução muito melhor que o Thread BTW. Então, eu prefiro:
Esta resposta é basicamente a mesma que esta pergunta semelhante: Como passar parâmetros para um objeto Thread
fonte
parameter
direto a partir dorun()
método sem usar um campo como op
mesmo. Parece funcionar. Existe alguma multithreading coisa sutil que estou em falta por não copiarparameter
ap
de antemão?)
no primeiro exemplofinal X parameter
antes danew Runnable()
linha, então eu poderia acessarparameter
dentrorun()
. Eu não precisava fazer o extrap = parameter
.final
não é mais tão importante assim; é o suficiente se a variável é efetivamente finais (apesar não faz mal tê-lo)via construtor de uma classe Runnable ou Thread
fonte
@Override
para?@Override
declara explicitamente que está substituindo o método abstrato na classe Thread.Essa resposta chega muito tarde, mas talvez alguém a ache útil. É sobre como passar um (s) parâmetro (s) para um
Runnable
sem nem mesmo declarar uma classe nomeada (útil para inliners):É claro que você pode adiar a execução
start
para um momento mais conveniente ou apropriado. E depende de você qual será a assinatura doinit
método (para que possa levar mais e / ou argumentos diferentes) e, claro, até o nome, mas basicamente você tem uma idéia.De fato, há também outra maneira de passar um parâmetro para uma classe anônima, com o uso dos blocos inicializadores. Considere isto:
Então tudo acontece dentro do bloco inicializador.
fonte
this.myParam
então é realmente necessário? Você não pode simplesmente eliminar as variáveis privadas e se referir à variável do escopo externo? Entendo (é claro) que isso tem algumas implicações, como a variável aberta a alterações após o início do thread.Quando você cria um encadeamento, precisa de uma instância de
Runnable
. A maneira mais fácil de passar um parâmetro seria passá-lo como um argumento para o construtor:Se você quiser alterar o parâmetro enquanto o encadeamento estiver em execução, basta adicionar um método setter à sua classe executável:
Depois de ter isso, você pode alterar o valor do parâmetro chamando assim:
Obviamente, se você quiser acionar uma ação quando o parâmetro for alterado, precisará usar bloqueios, o que torna as coisas consideravelmente mais complexas.
fonte
Para criar um thread, você normalmente cria sua própria implementação do Runnable. Passe os parâmetros para o thread no construtor desta classe.
fonte
Você pode estender o ou oe fornecer os parâmetros que desejar. Existem exemplos simples nos documentos . Vou portá-los aqui:
Thread
class
Runnable
class
fonte
Escreva uma classe que implemente Runnable e passe o que for necessário em um construtor definido adequadamente ou escreva uma classe que estenda o Thread com um construtor definido adequadamente que chame super () com os parâmetros apropriados.
fonte
No Java 8, você pode usar um lambda para capturar parâmetros efetivamente finais . Por exemplo:
fonte
No Java 8, você pode usar
lambda
expressões com a API de simultaneidade eExecutorService
como uma substituição de nível superior para trabalhar diretamente com threads:Veja também
executors
javadocs .fonte
Sei que estou alguns anos atrasado, mas me deparei com essa questão e adotei uma abordagem pouco ortodoxa. Eu queria fazer isso sem fazer uma nova aula, então é isso que eu criei:
fonte
Passagem de parâmetro pelos métodos start () e run ():
fonte
Você pode derivar uma classe de Runnable e, durante a construção (digamos), passar o parâmetro
Em seguida, inicie-o usando Thread.start (Runnable r);
Se você quer dizer enquanto o encadeamento está em execução, simplesmente mantenha uma referência ao seu objeto derivado no encadeamento de chamada e chame os métodos apropriados do setter (sincronizando quando apropriado)
fonte
Existe uma maneira simples de passar parâmetros para as executáveis. Código:
fonte
Não, você não pode passar parâmetros para o
run()
método. A assinatura informa que (ele não possui parâmetros). Provavelmente, a maneira mais fácil de fazer isso seria usar um objeto criado especificamente para obter um parâmetro no construtor e armazená-lo em uma variável final:Depois de fazer isso - você deve ter cuidado com a integridade dos dados do objeto que passa para a 'WorkingTask'. Os dados agora existirão em dois threads diferentes, portanto, você deve garantir que seja Thread Safe.
fonte
Mais uma opção; Essa abordagem permite usar o item Runnable como uma chamada de função assíncrona. Se a sua tarefa não precisar retornar um resultado, por exemplo, apenas executar alguma ação, você não precisará se preocupar com a forma como repassa um "resultado".
Esse padrão permite reutilizar um item, no qual você precisa de algum tipo de estado interno. Quando não for passando parâmetro (s) no cuidado do construtor, é necessário mediar o acesso dos programas aos parâmetros. Você pode precisar de mais verificações se o seu caso de uso envolver chamadas diferentes etc.
}
Thread t = new Thread (novo MyRunnable (parâmetro)); t.start ();
Se você precisar de um resultado do processamento, também precisará coordenar a conclusão do MyRunnable quando a subtarefa terminar. Você pode passar uma chamada de volta ou apenas esperar no Thread 't', etc.
fonte
Especialmente para Android
Para fins de retorno de chamada, geralmente implemento meu próprio genérico
Runnable
com parâmetro (s) de entrada:O uso é simples:
No gerente:
fonte
Crie uma variável local em sua classe que
extends Thread
ouimplements Runnable
.Dessa forma, você pode passar uma variável ao executá-la.
A saída:
fonte