Java est-il compatible avec les processeurs multicore/traitement en parallèle?

je sais que maintenant que la plupart des processeurs ont deux cœurs ou plus, la programmation multicore est à la mode. Existe-t-il une fonctionnalité pour l'utiliser en Java? Je sais que Java a une classe Thread, mais je sais aussi que c'était bien avant que multicores ne devienne populaire. Si je peux utiliser plusieurs cœurs en Java, quelle classe / technique devrais-je utiliser?

34
demandé sur Rafe Kettler 2010-07-25 22:22:23

5 réponses

est-ce que Java a un support pour multicore processeurs/traitement parallèle?

Oui. Il a également été une plate-forme pour d'autres langages de programmation où la mise en œuvre a ajouté un "vrai multithreading" ou "vrai threading" point de vente. Le collecteur D'ordures G1 introduit dans les nouvelles versions utilise également du matériel multi-core.

Java Competiency in Practice

Essayer d'obtenir une copie de la Java Simultanéité dans la Pratique livre.


si je peux faire usage de plusieurs cœurs dans Java, quelle classe/technique je utilisez?

java.util.concurrent

classes D'utilité programmation simultanée . Ce package comprend quelques petites normalisé cadres extensibles, ainsi que certains des classes qui fournissent des fonctionnalité et sont autrement pénible ou difficile à mettre en œuvre. Voici une brève description de la composants principaux.

exécuteurs testamentaires

Executor est une interface standardisée simple pour définir les sous-systèmes de type thread personnalisé, y compris les pools de thread, des structures de travail légères et asynchrones.

Files d'attente

La java.util.la classe concurrente ConcurrentLinkedQueue fournit une file d'attente FIFO non bloquante et évolutive.

"1519360920 de" Timing

la classe TimeUnit fournit de multiples granularités (y compris des nanosecondes) pour la spécification et le contrôle des opérations basées sur le temps mort. La plupart des les classes du paquet contiennent des opérations basées sur des temps d'attente illimités.

synchroniseurs

Quatre classes de l'aide commune à des fins spéciales de la synchronisation des expressions idiomatiques. Semaphore est un outil de concurrence classique. CountDownLatch est une utilité très simple mais très courante pour bloquer jusqu'à ce qu'un certain nombre de signaux, d'événements ou de conditions tiennent. [...]

Concurrent Collections

outre les Files d'attente, ce paquet fournit quelques implémentations de Collection conçues pour être utilisées dans des contextes multithread: ConcurrentHashMap , CopyOnWriteArrayList , et CopyOnWriteArraySet .


cela est également pratique si vous voulez faire correspondre le nombre de threads au nombre de CPU disponibles par exemple:

int n = Runtime.getRuntime().availableProcessors();
40
répondu bakkal 2010-07-25 19:10:08

dans la plupart des implémentations Java, vous pouvez compter sur les threads Java qui sont de vrais threads OS. Par conséquent, le système d'exploitation veillera à ce que la charge de travail soit répartie entre plusieurs cœurs si vous utilisez la classe Thread.

threads système D'exploitation pré-date marchandises systèmes multicore par un long temps, de sorte que ce n'est pas un problème vraiment. La seule différence entre les systèmes multicore était de permettre l'exécution de threads de systèmes d'exploitation multiplexés dans le temps vraiment des fils concurrents sur des noyaux multiples.

8
répondu Gian 2010-07-25 18:32:42

Java 5 introduit le java.util.paquet concurrent qui aide à construire des applications concurrentes qui peuvent bénéficier de systèmes multicores. Ce paquet va bien au-delà de la fonctionnalité multithreading offerte en Java 1.4 et plus tôt (comme synchronized, wait, notify, etc.).

il y a une proposition pour Java 7 d'inclure le Fork/Join framework pour rendre l'utilisation des systèmes multicore plus facile.

7
répondu Richard Kettelerij 2010-07-25 18:31:38

vous trouverez nouveau fonctionnalité dans Ateji PX, une extension du langage Java avec des primitives parallèles inspirées de pi-calcul. Très différent de la programmation de thread et de tout ce qui est basé sur le thread (tâches, exécuteurs, etc.).

le parallélisme introduit de cette façon au niveau du langage, par opposition aux librairies filetées qui fournissent un accès API à un concept essentiellement au niveau du matériel, rend la programmation multicore plus simple et intuitive.

il s'agit d'une approche radicalement nouvelle de la programmation parallèle qui mérite d'être lue (avertissement: je suis le concepteur d'Ateji PX). Le livre blanc est ici : http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf .

2
répondu Patrick Viry 2010-07-28 11:59:37

Oui. Java fournit API concurrent pour profiter des avantages des processeurs multi-core de la machine.

vous pouvez obtenir le nombre de processeurs disponibles à partir de L'exécution et utiliser ce nombre pour créer ExecutorService à travers de nombreux API dans Executors .

vous pouvez également utiliser L'API ThreadPoolExecutor pour obtenir le même résultat.

Java 8 fournit une API de plus: newWorkStealingPool, qui crée ForkJoinPool en utilisant tous les processeurs disponibles. Vous n'avez pas à passer le nombre de processeurs comme paramètre.

Avoir un coup d'oeil à l'échantillon de code:

int processorCount = Runtime.getRuntime().availableProcessors();

ExecutorService executor1 = Executors.newFixedThreadPool(processorCount);
ExecutorService executor2 =  
                            Executors.newScheduledThreadPool(processorCount);
ExecutorService executor3 = Executors.newWorkStealingPool(); // java-8 API
ForkJoinPool forkJoinPool = new ForkJoinPool(processorCount);

regardez liées SE question le droit d'Exécuteur testamentaire:

Java Fork / Join vs ExecutorService-when to use which?

0
répondu Ravindra babu 2017-05-23 11:46:01