JavaRush /Java Blog /Random-IT /Multithread in Java

Multithread in Java

Pubblicato nel gruppo Random-IT

introduzione

Prima di conoscere i thread Java, diamo un'occhiata al prossimo futuro. Immagina di aver inviato il tuo curriculum e di aver sostenuto un colloquio. Tu e un paio di dozzine di futuri colleghi siete stati invitati a lavorare presso una grande azienda di software. Tra le altre seccature, è necessario inviare documenti cartacei per l'assunzione a un dipendente delle risorse umane stanco.
Multithreading in Java - 1
Per accelerare il processo, i candidati alla posizione possono essere divisi in due gruppi e distribuiti tra due responsabili delle risorse umane (se presenti in azienda). Di conseguenza, acceleriamo il processo grazie al lavoro di progettazione parallelo .
Multithreading in Java - 2
Se nell'azienda c'è un solo ufficiale del personale, dovrai in qualche modo uscire. Ad esempio, puoi nuovamente dividere tutti in due gruppi, ad esempio intervistare a turno ragazze e ragazzi.
Multithread in Java - 3
Oppure secondo un altro principio: poiché nel gruppo inferiore ci sono più persone, alterneremo due ragazze per un ragazzo.
Multithreading in Java - 4
Questo modo di organizzare il lavoro si chiama multi-thread . Il nostro stanco responsabile delle risorse umane passa a diversi gruppi per reclutare da loro il dipendente successivo. Ci sono forse undici gruppi e quattro ufficiali del personale. In questo caso, l'elaborazione multithreading avverrà in parallelo da parte di più risorse umane, che potranno assumere la persona successiva di qualsiasi gruppo per elaborare i suoi documenti.

Processi

Il processo ( processo ) in questo caso sarà l'organizzazione del lavoro di ricezione dei documenti. In un'organizzazione si possono distinguere diversi processi: contabilità, sviluppo software, incontri con i clienti, operazioni di magazzino, ecc. Per ogni processo vengono allocate risorse: locali, dipendenti per la sua esecuzione. I processi sono isolati gli uni dagli altri: i responsabili delle risorse umane non hanno accesso al database contabile e i responsabili del servizio clienti non corrono per il magazzino. Se un processo ha bisogno di accedere alle risorse di qualcun altro, è necessario stabilire una comunicazione tra processi: promemoria, riunioni congiunte.

Flussi

Il lavoro in un processo è organizzato in thread ( java thread). Per il dipartimento Risorse umane, il flusso è l'organizzazione del lavoro al servizio di un gruppo. Nella primissima immagine c'è un flusso, nelle tre successive ce ne sono due. All'interno del processo, i thread possono essere eseguiti in parallelo: due responsabili delle risorse umane accettano due o più gruppi di futuri dipendenti. L'interazione degli ufficiali del personale con i gruppi – l'elaborazione dei thread all'interno di un processo – è chiamata sincronizzazione dei thread . I disegni della progettazione di due gruppi da parte di un ufficiale del personale mostrano metodi: uniforme (ragazza - ragazzo - ragazza - ragazzo) e con priorità diverse (due ragazze si alternano con un ragazzo). I thread hanno accesso alle risorse del processo a cui appartengono: ai gruppi del responsabile delle risorse umane vengono forniti campioni di moduli di domanda, penne per la compilazione di documenti. Ma se i flussi interagiscono con le cose che li accomunano, allora gli incidenti sono possibili. Se l’ufficiale del personale vi chiede di gridare il nome dell’ultima persona della fila, nel caso di due gruppi non è sicuro in anticipo se sentirà il nome di una donna o quello di un uomo. Tali conflitti di accesso ai dati, i blocchi e le modalità per risolverli sono un argomento molto importante.

Stati di flusso

Ogni thread si trova in uno dei seguenti stati:
  • Creato ( New) – la linea per il responsabile delle risorse umane si sta preparando, le persone si stanno organizzando.
  • Lanciato ( Runnable) – la nostra coda è stata allineata per il responsabile delle risorse umane ed è in fase di elaborazione.
  • Bloccato ( Blocked) – l'ultimo ragazzo della coda cerca di gridare un nome, ma quando ha sentito che la ragazza del gruppo successivo aveva iniziato a farlo prima di lui, è rimasto in silenzio.
  • Completato ( Terminated) - l'intera coda è stata completata dal responsabile delle risorse umane e non ce n'è bisogno.
  • Waiting( Waiting) – una coda è in attesa di un segnale da un'altra.
L'organizzazione dei thread e la loro interazione è la base per l'efficace funzionamento dei processi.

Torniamo al mondo IT

Nel 21° secolo, l’esecuzione multi-thread e parallela è diventata rilevante. Dagli anni '90 del secolo scorso, i sistemi operativi multitasking Windows, MacOS e Linux si sono affermati saldamente sui computer di casa. Spesso puoi trovare quattro o più processori core al loro interno. Il numero di blocchi paralleli delle schede video GPU ha già superato il migliaio. I programmi più diffusi sono scritti tenendo conto del multithreading (multithreading), ad esempio versioni moderne di software per l'elaborazione di grafica, video o per il funzionamento con grandi quantità di dati: Adobe Photoshop, WinRar, Mathematica, giochi moderni. Il multithreading Java è un argomento molto importante, popolare e complesso. Pertanto nel corso JavaRush ci sono molti compiti per capirlo molto bene. Esempi Java sul multithreading ti aiuteranno a padroneggiare le sfumature e le sottigliezze di base di quest'area, sincronizzando il lavoro dei thread.

Processi

Process è un'istanza in esecuzione di un programma a cui il sistema operativo (OS) ha allocato memoria, tempo/core del processore e altre risorse. È importante che la memoria venga allocata separatamente; gli spazi degli indirizzi di diversi processi non sono accessibili tra loro. Se i processi devono comunicare, possono farlo utilizzando file, pipe e altri metodi di comunicazione tra processi.

Fluire

Java Thread(flusso). A volte, per evitare confusione con altre classi Java Streame simili, i thread Java vengono spesso tradotti come thread. Utilizzano le risorse allocate a un processo e rappresentano il modo in cui il processo viene eseguito. Il thread principale esegue il metodo mained esce. Quando un processo viene eseguito, possono essere generati thread aggiuntivi (thread figli). I thread dello stesso processo possono scambiarsi dati tra loro. Il multithreading Java richiede che venga presa in considerazione la sincronizzazione dei dati, non dimenticatelo. In Java, un processo termina quando è terminato il suo ultimo thread. Per le attività in background, un thread può essere avviato come demone ( daemon), la differenza rispetto a uno normale è che verranno terminati forzatamente quando daemonterminano tutti i non thread del processo.

Prima applicazione multi-thread

Esistono più di una mezza dozzina di modi per creare thread; nel corso JavaRush li esamineremo in dettaglio. Per prima cosa, facciamo conoscenza con uno di quelli di base. Esiste una classe speciale Threadnel metodo run()in cui è necessario scrivere il codice che implementa la logica del programma. Dopo aver creato un thread, puoi avviarlo chiamando il file start(). Scriviamo un programma demo che implementa un esempio di multithreading Java.
class PeopleQueue extends Thread    {// Наша очередь из сотрудников, наследник класса Thread
    private String[] names;

    PeopleQueue(String... names) {// Конструктор, аргумент- массив имен сотрудников
        this.names = names;
    }

    @Override
    public void run() { // Этот метод будет вызван при старте потока
        for (int i = 0; i < names.length; i++) { // Вывод в цикле с паузой 0.5 сек очередного сотрудника
            System.out.println("Обработаны documentы: " + names[i]);
            try {
                sleep(500); // Задержка в 0.5 сек
            } catch (Exception e) {}
        }
    }
}

public class HR    {// Класс для демонстрации работы потока
    public static void main(String[] args) {
        // Создаем две очереди
        PeopleQueue queue1 = new PeopleQueue("Ivan","Сергей","Николай","Фердинанд","Basil");
        PeopleQueue queue2 = new PeopleQueue("Мария","Людмила","Алиса","Карина","Olga");

        System.out.println("Начали!"); // Сообщение из главного потока программы
        queue1.start();    //Запускаем одну очередь (дочерний поток)
        queue2.start(); //Запускаем вторую (дочерний поток)
    }
}
Lanciamo il programma. La console visualizza l'output del messaggio dal thread principale. Successivamente, ogni thread figlio a sua volta queue1invia queue2messaggi alla propria console comune sul successivo dipendente elaborato. Una delle possibili opzioni per il programma:
Начали!
Обработаны documentы: Мария
Обработаны documentы: Ivan
Обработаны documentы: Людмила
Обработаны documentы: Сергей
Обработаны documentы: Алиса
Обработаны documentы: Николай
Обработаны documentы: Карина
Обработаны documentы: Фердинанд
Обработаны documentы: Ольга
Обработаны documentы: Васorй

Process finished with exit code 0
Il multithreading in Java è un argomento complesso e sfaccettato. La capacità di scrivere codice utilizzando l'elaborazione parallela, multitasking e multithread ti aiuterà a implementare in modo efficace le attività sui moderni processori multi-core e cluster costituiti da molti computer.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION