Java ha supporto per processori multicore / elaborazione parallela?

So che ora che la maggior parte dei processori ha due o più core, la programmazione multicore è di gran moda. C’è funzionalità per utilizzare questo in Java? So che Java ha una class Thread, ma so anche che è stato molto tempo prima che i multicore diventassero popolari. Se posso utilizzare più core in Java, quale class / tecnica dovrei usare?

Java ha supporto per processori multicore / elaborazione parallela?

Sì. È stata anche una piattaforma per altri linguaggi di programmazione in cui l’implementazione ha aggiunto un punto di vendita “vero multithreading” o “reale threading”. Il G1 Garbage Collector introdotto nelle versioni più recenti utilizza anche hardware multi-core.

Concorrenza Java in pratica

Prova a ottenere una copia del libro Concurrency Java in Practice .


Se posso utilizzare più core in Java, quale class / tecnica dovrei usare?

java.util.concurrent

Classi di utilità comunemente utili nella programmazione concorrente . Questo pacchetto include alcuni piccoli framework estensibili standardizzati, così come alcune classi che forniscono funzionalità utili e sono altrimenti noiose o difficili da implementare. Ecco brevi descrizioni dei componenti principali.

esecutori

Executor è una semplice interfaccia standardizzata per la definizione di sottosistemi thread-like personalizzati, inclusi pool di thread, IO asincrono e framework di task leggero.

code

La class ConcurrentLinkedQueue java.util.concurrent fornisce una coda FIFO non bloccante e thread-safe scalabile efficiente.

sincronizzazione

La class TimeUnit fornisce più granularità (compresi i nanosecondi) per specificare e controllare le operazioni basate sul timeout. La maggior parte delle classi nel pacchetto contiene operazioni basate su timeout in aggiunta alle attese indefinite.

sincronizzatori

Quattro classi aiutano gli idiomi di sincronizzazione di scopo speciale comune. Semaphore è un classico strumento di concorrenza. CountDownLatch è un’utilità molto semplice ma molto comune per il blocco fino a quando non viene mantenuto un determinato numero di segnali, eventi o condizioni. […]

Collezioni simultanee

Oltre alle code, questo pacchetto fornisce alcune implementazioni di raccolta progettate per l’utilizzo in contesti multithread: ConcurrentHashMap , CopyOnWriteArrayList e CopyOnWriteArraySet .


Questo è utile anche se si desidera adattare il numero di thread al numero di CPU disponibili, ad esempio:

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

Nella maggior parte delle implementazioni Java, puoi fare affidamento su thread Java che sono veri thread del sistema operativo. Di conseguenza, il sistema operativo si prenderà cura di assicurarsi che il carico di lavoro sia distribuito su più core se si utilizza la class Thread.

I thread del sistema operativo precedono i sistemi multicore di materie prime da molto tempo, quindi non è una vera preoccupazione. L’unica differenza dei sistemi multicore realizzati era quella di consentire che i thread del sistema operativo multiplato nel tempo venissero eseguiti come thread concomitanti su più core.

Java 5 ha introdotto il pacchetto java.util.concurrent che aiuta a creare applicazioni concorrenti che possono beneficiare di sistemi multicore. Questo pacchetto va ben oltre le funzionalità di multithreading offerte in Java 1.4 e precedenti (come sincronizzazione, attesa, notifica, ecc.).

C’è una proposta per Java 7 per includere il framework Fork / Join per utilizzare i sistemi multicore più facilmente.

Troverai nuove funzionalità in Ateji PX, un’estensione del linguaggio Java con primitive parallele ispirate al pi-calcolo. Molto diverso dalla programmazione dei thread e da tutto ciò che è basato su thread (compiti, esecutori, ecc.).

Il parallelismo è stato introdotto in questo modo a livello di linguaggio, al contrario delle librairie di threading che forniscono accesso API a un concetto per lo più a livello di hardware, rende la programmazione multicore molto più semplice e intuitiva.

È un approccio radicalmente nuovo alla programmazione parallela che vale la pena leggere (disclaimer: I am the designer of Ateji PX). Il white paper è qui: http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf .

Sì. Java fornisce API simultanee per usufruire dei vantaggi dei processori multi-core della macchina.

È ansible ottenere il conteggio dei processori disponibili da Runtime e utilizzare tale conteggio per creare ExecutorService tramite molte API in Executor .

È anche ansible utilizzare l’ API ThreadPoolExecutor per ottenere lo stesso risultato.

Java 8 fornisce un’altra API: newWorkStealingPool, che crea ForkJoinPool utilizzando tutti i processori disponibili. Non è necessario passare il conteggio del processore come parametro.

Dai un’occhiata a sample to 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); 

Dai un’occhiata alla domanda SE relativa a destra Executor:

Java’s Fork / Join vs ExecutorService – quando usare quale?