JavaRush /Blog Java /Random-FR /Multithreading en Java

Multithreading en Java

Publié dans le groupe Random-FR

Introduction

Avant d'en savoir plus sur les threads Java, regardons le futur proche. Imaginez que vous soumettez votre curriculum vitae et que vous ayez un entretien. Vous et quelques dizaines de futurs collègues avez été invités à travailler dans une grande entreprise de logiciels. Entre autres tracas, vous devez soumettre des documents papier pour un emploi à un employé des ressources humaines fatigué.
Multithreading en Java - 1
Pour accélérer le processus, les candidats au poste peuvent être divisés en deux groupes et répartis entre deux responsables RH (s'il y en a dans l'entreprise). En conséquence, nous accélérons le processus grâce à un travail de conception parallèle .
Multithreading en Java - 2
S'il n'y a qu'un seul responsable du personnel dans l'entreprise, vous devrez alors vous en sortir. Par exemple, vous pouvez à nouveau diviser tout le monde en deux groupes, par exemple interroger tour à tour les filles et les garçons.
Multithreading en Java - 3
Ou selon un autre principe : comme il y a plus de monde dans le groupe inférieur, on alternera deux filles pour un garçon.
Multithreading en Java - 4
Cette façon d'organiser le travail est appelée multithread . Notre responsable RH fatigué passe à différents groupes pour recruter le prochain employé parmi eux. Il y a peut-être onze groupes et quatre officiers du personnel. Dans ce cas, le traitement multithreading se fera en parallèle par plusieurs RH, qui pourront prendre la personne suivante de n'importe quel groupe pour traiter ses documents.

Processus

Le processus ( processus ) dans ce cas sera l'organisation du travail de réception des documents. Dans une organisation, plusieurs processus peuvent être distingués : comptabilité, développement de logiciels, réunions avec les clients, opérations d'entrepôt, etc. Des ressources sont allouées à chaque processus : locaux, employés pour son exécution. Les processus sont isolés les uns des autres : les responsables RH n'ont pas accès à la base de données comptable et les responsables du service client ne courent pas dans l'entrepôt. Si un processus a besoin d'accéder aux ressources d'autrui, il est nécessaire d'établir une communication inter-processus : mémos, réunions communes.

Ruisseaux

Le travail dans un processus est organisé en threads ( java thread). Pour la fonction RH, le flux est l'organisation du travail au service d'un groupe. Dans la toute première image, il y a un flux, dans les trois suivantes, il y en a deux. Au cours du processus, des threads peuvent être exécutés en parallèle : deux responsables RH acceptent deux ou plusieurs groupes de futurs employés. L'interaction des responsables du personnel avec les groupes - le traitement des threads au sein d'un processus - est appelée synchronisation des threads . Les dessins de conception de deux groupes par un officier du personnel montrent des méthodes : uniformes (fille - garçon - fille - garçon) et avec des priorités différentes (deux filles alternent avec un garçon). Les fils de discussion ont accès aux ressources du processus auquel ils appartiennent : les groupes du responsable RH reçoivent des échantillons de formulaires de candidature, des stylos pour remplir les documents. Mais si les flux interagissent avec des éléments qui leur sont communs, alors des incidents sont possibles. Si le responsable du personnel vous demande de crier le nom de la dernière personne dans la file d’attente, alors, dans le cas de deux groupes, il ne sait pas à l’avance s’il entendra le nom d’une femme ou celui d’un homme. De tels conflits d'accès aux données, leur blocage et les moyens de les résoudre constituent un sujet très important.

États de flux

Chaque thread est dans l'un des états suivants :
  • Créé ( New) – la file d'attente pour le responsable RH se prépare, les gens s'organisent.
  • Lancé ( Runnable) – notre file d'attente s'est alignée pour le responsable des ressources humaines et est en cours de traitement.
  • Bloqué ( Blocked) – le dernier gars dans la file d'attente essaie de crier un nom, mais lorsqu'il entend que la fille du groupe suivant a commencé à le faire avant lui, il se tait.
  • Terminé ( Terminated) - toute la file d'attente a été complétée par le responsable des ressources humaines et cela n'est pas nécessaire.
  • Waiting( Waiting) – une file d’attente attend un signal d’une autre.
L'organisation des threads et leur interaction constituent la base du fonctionnement efficace des processus.

Revenons au monde informatique

Au 21e siècle, l'exécution multithread et parallèle est devenue pertinente. Depuis les années 90 du siècle dernier, les systèmes d'exploitation multitâches Windows, MacOS et Linux se sont solidement implantés sur les ordinateurs personnels. Vous pouvez souvent y trouver quatre processeurs centraux ou plus. Le nombre de blocs parallèles de cartes vidéo GPU a déjà dépassé le millier. Les programmes populaires sont écrits en tenant compte du multithreading (multithreading), par exemple des versions modernes de logiciels de traitement graphique, vidéo ou fonctionnant avec de grandes quantités de données : Adobe Photoshop, WinRar, Mathematica, jeux modernes. Le multithreading Java est un sujet très important, populaire et complexe. Par conséquent, dans le cours JavaRush, il existe de nombreuses tâches pour très bien le comprendre. Des exemples Java sur le multithreading vous aideront à maîtriser les nuances et subtilités de base de ce domaine, en synchronisant le travail des threads.

Processus

Le processus est une instance en cours d'exécution d'un programme auquel le système d'exploitation (OS) a alloué de la mémoire, du temps/cœurs de processeur et d'autres ressources. Il est important que la mémoire soit allouée séparément ; les espaces d'adressage des différents processus ne sont pas accessibles les uns aux autres. Si les processus doivent communiquer, ils peuvent le faire à l’aide de fichiers, de canaux et d’autres méthodes de communication interprocessus.

Couler

Java Thread(flux). Parfois, pour éviter toute confusion avec d'autres classes Java, Streametc., les threads Java sont souvent traduits par thread. Ils utilisent les ressources allouées à un processus et constituent la manière dont le processus est exécuté. Le thread principal exécute la méthode mainet se termine. Lorsqu'un processus s'exécute, des threads supplémentaires (threads enfants) peuvent être générés. Les threads d’un même processus peuvent échanger des données entre eux. Le multithreading Java nécessite de prendre en compte la synchronisation des données, ne l'oubliez pas. En Java, un processus se termine lorsque son dernier thread est terminé. Pour les tâches en arrière-plan, un thread peut être démarré en tant que démon ( daemon), la différence avec un thread normal est qu'il sera terminé de force lorsque tous les non- daemonthreads du processus se termineront.

Première application multithread

Il existe plus d'une demi-douzaine de façons de créer des threads ; dans le cours JavaRush, nous les examinerons en détail. Tout d’abord, faisons connaissance avec l’un des principaux. Il existe une classe spéciale Threaddans la méthode run()dans laquelle vous devez écrire du code qui implémente la logique du programme. Après avoir créé un fil de discussion, vous pouvez le démarrer en appelant le start(). Écrivons un programme de démonstration qui implémente un exemple de 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(); //Запускаем вторую (дочерний поток)
    }
}
Lançons le programme. La console affiche le message généré par le thread principal. Ensuite, chaque thread enfant queue1envoie à queue2son tour des messages sur sa console commune concernant le prochain employé traité. Une des options possibles pour le programme :
Начали!
Обработаны documentы: Мария
Обработаны documentы: Ivan
Обработаны documentы: Людмила
Обработаны documentы: Сергей
Обработаны documentы: Алиса
Обработаны documentы: Николай
Обработаны documentы: Карина
Обработаны documentы: Фердинанд
Обработаны documentы: Ольга
Обработаны documentы: Васorй

Process finished with exit code 0
Le multithreading en Java est un sujet complexe et multiforme. La capacité d'écrire du code à l'aide d'une informatique parallèle, multitâche et multithread vous aidera à mettre en œuvre efficacement des tâches sur des processeurs multicœurs modernes et des clusters composés de nombreux ordinateurs.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION