2011-07-21 5 views
3

J'essaie de comprendre comment multithread dans Java. À l'heure actuelle, mon programme fonctionne très bien sans concurrence, mais je veux mettre en œuvre le multithreading pour l'accélérer.Multithreading java

Le programme exécute plusieurs objets d'une sous-classe distincte et 50% de l'évaluation de temps pour chacun de ces objets est passé dans un processus qui utilise seulement un noyau plutôt que les 8 disponibles. Ces objets sont complètement indépendants les uns des autres jusqu'à ce qu'ils soient utilisés comme entrées dans le programme. J'essaye de multithread ceci en ayant l'exécutable de sous-classe Runnable et puis mon programme utilise un thread pour chaque tel objet. Serait-ce la bonne façon?

Cependant, comment sont gérés les threads dans java? Aurais-je besoin de disposer des threads après chaque course? Comment fonctionne le travail?

grâce

+2

Si vous écrivez une application sérieuse, vous devriez vraiment regarder dans la théorie: http://download.oracle.com/javase/tutorial/essential/concurrency/. Sinon vous l'apprendrez à la dure :-) – home

Répondre

5

Vous êtes à peu près sur la bonne voie. Vous allez créer un objet Thread

Runnable r = new MyClassImplementingRunnable(); 
Thread t = new Thread(p); 
t.start(); 
t.join(); // wait for thread to die 

L'objet de cette discussion est détruite comme tout autre objet, le fil lui-même meurt lorsque la méthode d'exécution complète. L'essentiel est que la méthode d'exécution de votre runnable doit vraiment garantir le retour, votre conception ne peut pas dépendre d'être capable de tuer le fil de l'extérieur.

Si vous devez avoir beaucoup de threads, vous devez attendre qu'ils soient tous terminés. Vous pouvez donc conserver une collection des threads que vous avez démarrés, puis utiliser t.join (smallNumberOfMillis) pour voir lequel des threads eux a fini. C'est un peu inefficace donc il y a d'autres techniques pour permettre aux threads de communiquer les uns avec les autres, je suggère de lire this article à leur sujet. @denis mentionne également que l'Executor et les classes associées fournissent une meilleure abstraction au-dessus de Threads. Si vous souhaitez apprendre l'arrière-plan, il est intéressant de gérer manuellement Threads. Si vous voulez simplement faire le travail, suivez la suggestion de Denis.

+0

pas comme il faut pour gérer les threads manuellement :) –

+0

bien oui, c'est un cas de ça il apprend d'abord les détails sous-jacents ou utilise l'abstraction plus agréable. – djna

+0

Comment configurer la méthode d'exécution dans la sous-classe? En ce moment je reçois une erreur d'exception nullpointer levée – randomafk

7

Ne pas gérer les discussions, prendre manuellement un oeil à executors and thread pools en java

+0

Je vais y jeter un coup d'oeil plus tard, mais je veux d'abord comprendre les principes de base de Hte. – randomafk

+1

@randomafk: Ceux * sont * les bases. –

3

Jetez un oeil à http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html

Le constructeur prend le nombre de threads que vous voulez. Dans ce cas, la même chose que votre nombre de cœurs.

ScheduledThreadPoolExecutor s = new ScheduledThreadPoolExecutor(8); 
List<Future> futures = new ArrayList<Future>(); 
foreach(...something...) 
    futures.add(s.submit(new MyCallable())); 
foreach(Future f : futures) 
    f.get(); // Result of computation 
System.out.println("Done"); 
+0

Est-ce que la classe MyCallable doit avoir une fonction d'exécution spéciale comme avec Runnable? – randomafk

+0

Oui Callable est comme Runnable sauf défini comme interface Callable {V call(); } afin qu'ils puissent retourner un objet de votre type préféré. http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/Callable.html –

0

Ceci est une bonne façon de démarrer le multithreading.

public class ThreadExample { 
    public static void main(String[] args) { 
     //Main thread 
     System.out.println("Main thread"); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       //This thread is independent of the main thread 
       System.out.println("Inner Thread"); 
      } 
     }).start(); 
    } 
}