Jump to content
tcms

extended vs runnable (threads)

Recommended Posts

tcms

Boas pessoal,

Comecei agora com as threads, e ainda estou um pouco a zero. Contudo, verifiquei que é possivel manipular as as threads (com implementação diferente ) tanto com o runnable como com o extended. Qual a grande diferenca?

Share this post


Link to post
Share on other sites
bioshock

Não tenho conhecimento da extended,

Um exemplo prático do método runnable:

public void updateProgress(final int value) {
   runOnUiThread(new Runnable() {
		 @Override
		 public void run() {
			 ProgressBar mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
			 mProgressBar.setProgress(value);
		 }
	 });
}

Basta então chamares o procedimento em qualquer parte do código que não terás problemas. Se experimentares implementar o mesmo código dentro da mesma main thread, verás que terás erros de conflitos.

By default, all components of the same application run in the same process and thread (called the "main" thread). If an application component starts and there already exists a process for that application (because another component from the application exists), then the component is started within that process and uses the same thread of execution. However, you can arrange for different components in your application to run in separate processes, and you can create additional threads for any process.

Share this post


Link to post
Share on other sites
eatg75

Suponho que queirias dizer extender, i.e. herdar da classe Thread, como sabes o Java ao contrario do C++, Python, etc, nao suporta heranca multipla, e num problema que estejass a resolver precisas utilizar threads a primeira decisao seria criar uma nova classe e faze-la herdar da classe Thread, so que poderias ter um outro problema que e o seguinte : essa classe ja herdar, ou tem de herdar de uma classe especifica da solucao do problema que estas a resolver, como disse anteriormente Java nao suporta heranca multipla, logo essa nova classe nao podera de herdar de uma classe da tua solucao e da classe Thread em simultaneo, assim os desanhadores das bibliotecas decidiram facilitar a vida do programador criando uma interface a Runnable, que e implementada pela classe Thread e podera ser implementada por qualquer outra classe que precisa tirar proveito do paralelismo.

Para alem disso as boas praticas de um bom desenho orientado a objectos diz que uma classe deve herdar de uma outra se e somente se ela precisar extender, aprimorar um a operacao da classe.


Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Share this post


Link to post
Share on other sites
KTachyon

O método run() de um Runnable executa na thread onde é chamado. Ou seja, se criares um Runnable e executares o método run(), esse método não vai ser executado assincronamente. Tens sempre que o executar na thread em que pretendes que seja executado.

Como o eatg75 disse, o Runnable é uma interface que obriga a que o objecto que a implementa tenha esse método implementado. Isso garante que, ao passares um objecto que implementa o Runnable, o método run() tem mesmo que existir, logo pode ser chamado em qualquer sítio.

Numa framework que te faz a gestão do paralelismo (e/ou controlo de prioridades de código paralelo), o Runnable é a forma normal de permitir a execução de código do programador fora da thread principal sem te obrigar a gerir as threads manualmente.

Se o que te pedem é um Runnable, deves passar um Runnable e não um objecto que extende a Thread, a não ser que o objecto que queiras passar tenha obrigatoriamente que extender a Thread. E eu mesmo assim ainda pensava duas vezes na estrutura do código antes de o fazer.

O Runnable é uma forma mais adequada para desassociar código (decoupling, weak or loose coupling), o que tem tendência para ser a forma mais adequada de desenvolvimento.

EDIT: Para o caso de estares confuso, o Runnable não existe apenas sob a forma de uma classe anónima (como é o caso do código apresentado pelo bioshock). Podes perfeitamente criar um objecto que implementa a interface e passá-lo como parametro:

public class ProgressRunnable implements Runnable {
   ProgressBar mProgressBar;
   int value;

   public ProgressRunnable(ProgressBar mProgressBar, int value) {
       this.mProgressBar = mProgressBar;
       this.value = value;
   }

   @Override
   public void run() {
       mProgressBar.setProgress(value);
   }
}

public void updateProgress(final int value) {
   ProgressBar mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
   runOnUiThread(new ProgressRunnable(mProgressBar, value));
}

Repara na diferença:

No caso do código do bioshock, o Runnable é específico para a situação em que consegues encontrar uma ProgressBar com o id R.id.progressBar1. No caso do ProgressRunnable, podes reutilizar o objecto em qualquer parte do código onde precises alterar o progresso de uma ProgressBar. A minha abordagem está completamente desassociada do código em que executa, ao contrário da do bioshock.

Obviamente que, como é uma classe anónima (e que pode funcionar ao estilo de uma closure), que é específica ao código onde vai ser executado, é perfeitamente aceitável que faças daquela forma se não tiveres muitas ProgressBar numa aplicação ou muitos sítios no código onde vás fazer a actualização do valor da ProgressBar. Para estes casos, a vantagem também está na minha abordagem, porque cada sítio do código onde colocares a classe anónima para actualizar a ProgressBar, o compilador de Java vai gerar uma nova classe, o que significa que a JVM vai ter que lidar com mais classes em runtime.

Edited by KTachyon

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.