<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Threads</id>
	<title>Threads - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Threads"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Threads&amp;action=history"/>
	<updated>2026-10-23T22:54:34Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=Threads&amp;diff=3679&amp;oldid=prev</id>
		<title>Arribi: /* Instanciación de threads */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Threads&amp;diff=3679&amp;oldid=prev"/>
		<updated>2008-01-24T11:13:17Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Instanciación de threads&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Creación de threads==&lt;br /&gt;
Para crear un thread necesitamos que a clase teña o método &amp;lt;code&amp;gt;run()&amp;lt;/code&amp;gt;. Isto pódese conseguir de dúas formas, herdando da clase &amp;lt;code&amp;gt;Thread&amp;lt;/code&amp;gt; ou implementando o interface &amp;lt;code&amp;gt;Runnable&amp;lt;/code&amp;gt;. &lt;br /&gt;
===Herdar da clase java.lang.Thread===&lt;br /&gt;
O xeito máis simple de definir código para que se execute nun thread independente é o seguinte:&lt;br /&gt;
#Derivar da clase Thread.&lt;br /&gt;
#Sobrescribir o método run() que, de feito, na clase Thread está baleiro (ademais, o método run() pode estar sobrecargado)&lt;br /&gt;
Isto faise da seguinte forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
    class MeuThread extends Thread {&lt;br /&gt;
         public void run() {&lt;br /&gt;
           System.out.println(&amp;quot;Traballo importante executándose en MeuThread&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A principal limitación desta solución é que se herdamos de Thread non poderemos herdar de ningunha outra clase.&lt;br /&gt;
===Implementación da interface java.lang.Runnable===&lt;br /&gt;
Mediante a implementación de &amp;lt;code&amp;gt;Runnable&amp;lt;/code&amp;gt; podemos herdar de calquera outra clase, xa que é unha interface:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
   class ThreadRunnable implements Runnable {&lt;br /&gt;
       public void run() {&lt;br /&gt;
          System.out.println(&amp;quot;Traballo importante executándose en ThreadRunnable&amp;quot;);&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Independentemente do mecanismo que se use hai que instanciar un thread dende o código para poder executalo.&lt;br /&gt;
&lt;br /&gt;
==Instanciación de threads==&lt;br /&gt;
Se derivamos da clase Thread a instanciación é inmediata:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
MeuThread t = new MeuThread();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Se implementamos a interface Runnable tamén é moi simple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
ThreadRunnable r = new ThreadRunnable();&lt;br /&gt;
Thread t = new Thread(r);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
O seguinte código de exemplo amosa como crear un thread e poñelo a durmir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class Contador extends Thread {&lt;br /&gt;
   public void run() {&lt;br /&gt;
      for(int i = 1;i&amp;lt;=100;++i) {&lt;br /&gt;
         System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
         if(i % 10 == 0)&lt;br /&gt;
            System.out.println(&amp;quot;Ola, meu!&amp;quot;);&lt;br /&gt;
         try {&lt;br /&gt;
            Thread.sleep(1000);&lt;br /&gt;
         } catch(InterruptedException e) {}&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   public static void main(String [] args) {&lt;br /&gt;
      new Contador().start();&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nun thread só se pode chamar ao método start() unha vez. Se se chama máis dunha vez lanzarase unha RuntimeException.&lt;br /&gt;
Cando se instancia un Thread non será tal até que se invoque ao método start(). Cando un obxecto de tipo thread existe pero non foi iniciado co método start non se considera que estea &amp;quot;vivo&amp;quot;. Existe un método da clase Thread chamado isAlive que devolve true se o thread foi arrancado con start().&lt;br /&gt;
Executar o método start() non garante que se execute inmediatamente o método run(), simplemente, o thread pasará ao estado preparado. &amp;#039;&amp;#039;&amp;#039;Non se debe chamar ao método run() directamente&amp;#039;&amp;#039;&amp;#039;, xa que se executará o código deste método sen que interveña o planificador. É o método start() o que rexistra o thread no planificador de threads.&lt;br /&gt;
&lt;br /&gt;
==Os estados dun thread==&lt;br /&gt;
Unha vez que un thread se inicia (&amp;#039;&amp;#039;&amp;#039;start&amp;#039;&amp;#039;&amp;#039;) entrará sempre no estado de executable (&amp;#039;&amp;#039;&amp;#039;runnable&amp;#039;&amp;#039;&amp;#039;). O método start chama ao método run().&lt;br /&gt;
&lt;br /&gt;
O planificador de threads pode cambiar os estados dun thread entre excutándose (&amp;#039;&amp;#039;&amp;#039;running&amp;#039;&amp;#039;&amp;#039;) e executable (runnable).&lt;br /&gt;
&lt;br /&gt;
Só pode haber un thread executándose ao mesmo tempo, aínda que pode haber moitos en estado executable.&lt;br /&gt;
&lt;br /&gt;
A orde en que foron iniciados os threads non determina como se executarán.&lt;br /&gt;
&lt;br /&gt;
Polo tanto, os estados dun thread poden ser:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;En execución&amp;#039;&amp;#039;&amp;#039; (running). O thread está activo e ten asignada a CPU.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Preparado&amp;#039;&amp;#039;&amp;#039; (runnable). O thread está activo pero non ten asignada a CPU.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Bloqueado&amp;#039;&amp;#039;&amp;#039;. O thread está en espera de que outro thread elimini o bloqueo, momento no que pasará ao estado preparado.&lt;br /&gt;
&lt;br /&gt;
==Acceso concorrente e sincronización de threads==&lt;br /&gt;
Os métodos sincronizados úsanse para evitar que máis dun thread poda acceder a un método dun obxecto que teña código crítico. Por crítico entendemos calquer código que necesite unha execución exclusiva para evitar posibles inconsistencias provocadas pola execución de dous ou máis threads (por exemplo, os movementos que poden facer dúas persoas ao mesmo tempo sobre unha conta bancaria). Só se poden sincronizar métodos, non variables.&lt;br /&gt;
&lt;br /&gt;
A palabra clave &amp;#039;&amp;#039;&amp;#039;synchronized&amp;#039;&amp;#039;&amp;#039; pódese usar como modificador dun método ou para indicar o inicio dun bloque de código sincronizado. Para sincronizar un bloque de código (noutras palabras, un anaco de código menor que un método), hai que especificar un argumento que sexa o obxecto que se quere bloquear coa sincronización. Por exemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class SyncTest {&lt;br /&gt;
public void faiAlgo() {&lt;br /&gt;
    System.out.println(&amp;quot;non sincronizado&amp;quot;);&lt;br /&gt;
    synchronized(this) {&lt;br /&gt;
       System.out.println(&amp;quot;sincronizado&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Só un thread pode acceder a código sincronizado dunha instancia particular. Con todo, outros moitos threads poden acceder ao código non sincronizado do mesmo obxecto.&lt;br /&gt;
&lt;br /&gt;
Cando un thread pasa a estado durmido (sleep) o código que teña bloqueado seguirá así até que desperte.&lt;/div&gt;</summary>
		<author><name>Arribi</name></author>
	</entry>
</feed>