JavaRush /Blogue Java /Random-PT /Multithreading em Java

Multithreading em Java

Publicado no grupo Random-PT

Introdução

Antes de aprender sobre threads Java, vamos olhar para o futuro próximo. Imagine que você enviou seu currículo e fez uma entrevista. Você e algumas dezenas de futuros colegas foram convidados para trabalhar em uma grande empresa de software. Entre outras dificuldades, você precisa enviar documentos em papel para contratação de um funcionário de RH cansado.
Multithreading em Java - 1
Para agilizar o processo, os candidatos ao cargo podem ser divididos em dois grupos e distribuídos entre dois gestores de RH (se houver na empresa). Como resultado, aceleramos o processo devido ao trabalho de design paralelo .
Multithreading em Java - 2
Se houver apenas um diretor de pessoal na empresa, você terá que sair de alguma forma. Por exemplo, você pode novamente dividir todos em dois grupos, por exemplo, entrevistar meninas e meninos um a um.
Multithreading em Java - 3
Ou segundo outro princípio: como há mais pessoas no grupo inferior, alternaremos duas meninas para um menino.
Multithreading em Java - 4
Essa forma de organizar o trabalho é chamada de multithread . Nosso cansado oficial de RH muda para grupos diferentes para recrutar o próximo funcionário deles. Existem talvez onze grupos e quatro oficiais de pessoal. Neste caso, o processamento multithreading ocorrerá em paralelo por vários RHs, que poderão levar a próxima pessoa de qualquer grupo para processar seus documentos.

Processos

O processo ( processo ) neste caso será a organização do trabalho de recepção de documentos. Numa organização podem distinguir-se vários processos: contabilidade, desenvolvimento de software, reuniões com clientes, operações de armazém, etc. Para cada processo são atribuídos recursos: instalações, funcionários para a sua execução. Os processos são isolados uns dos outros: os responsáveis ​​de RH não têm acesso à base de dados contabilística e os gestores de atendimento ao cliente não circulam pelo armazém. Se um processo precisa ter acesso aos recursos de outra pessoa, é necessário estabelecer comunicação entre processos: memorandos, reuniões conjuntas.

Fluxos

O trabalho em um processo é organizado em threads ( java thread). Para o departamento de RH, fluxo é a organização do trabalho para atender um grupo. Na primeira foto há um fluxo, nas próximas três há dois. Dentro do processo, threads podem ser executadas em paralelo – dois responsáveis ​​de RH aceitam dois ou mais grupos de futuros funcionários. A interação dos oficiais de pessoal com grupos – o processamento de threads dentro de um processo – é chamada de sincronização de threads . Os desenhos de desenho de dois grupos por um oficial de pessoal mostram métodos: uniformes (menina - menino - menina - menino) e com prioridades diferentes (duas meninas se alternam com um menino). Os threads têm acesso aos recursos do processo a que pertencem: os grupos do responsável de RH recebem amostras de formulários de inscrição, canetas para preenchimento de documentos. Mas se os fluxos interagirem com coisas comuns a eles, então os incidentes serão possíveis. Se o oficial de pessoal pedir para você gritar o nome da última pessoa da fila, então, no caso de dois grupos, ele não tem certeza se ouvirá o nome de uma mulher ou de um homem. Tais conflitos de acesso a dados, bloqueios e formas de resolvê-los são um tema muito importante.

Estados de fluxo

Cada thread está em um dos seguintes estados:
  • Criada ( New) – a fila do RH está se preparando, as pessoas estão se organizando.
  • Lançado ( Runnable) – nossa fila está alinhada para o diretor de RH e está sendo processada.
  • Bloqueado ( Blocked) – o último jovem da fila tenta gritar um nome, mas ao saber que a garota do grupo seguinte começou a fazer isso antes dele, ficou em silêncio.
  • Concluída ( Terminated) - toda a fila foi preenchida pelo responsável de RH e não há necessidade disso.
  • Waiting( Waiting) – uma fila está aguardando um sinal de outra.
A organização dos threads e sua interação é a base para o funcionamento eficaz dos processos.

Vamos voltar ao mundo da TI

No século 21, a execução multithread e paralela tornou-se relevante. Desde a década de 90 do século passado, os sistemas operacionais multitarefa Windows, MacOS e Linux se estabeleceram firmemente nos computadores domésticos. Muitas vezes você pode encontrar quatro ou mais processadores principais neles. O número de blocos paralelos de placas de vídeo GPU já ultrapassou mil. Programas populares são escritos levando em consideração o multithreading (multithreading), por exemplo, versões modernas de software para processamento de gráficos, vídeo ou operação com grandes quantidades de dados: Adobe Photoshop, WinRar, Mathematica, jogos modernos. Multithreading Java é um tópico muito importante, popular e complexo. Portanto, no curso JavaRush existem muitas tarefas para entendê-lo muito bem. Exemplos Java sobre multithreading irão ajudá-lo a dominar as nuances e sutilezas básicas desta área, sincronizando o trabalho dos threads.

Processo

Processo é uma instância em execução de um programa para o qual o sistema operacional (SO) alocou memória, tempo/núcleos de processador e outros recursos. É importante que a memória seja alocada separadamente; os espaços de endereço de diferentes processos não são acessíveis entre si. Se os processos precisarem se comunicar, eles poderão fazê-lo usando arquivos, pipes e outros métodos de comunicação entre processos.

Fluxo

Java Thread(fluxo). Às vezes, para evitar confusão com outras classes Java Streame similares, os threads Java são frequentemente traduzidos como thread. Eles usam os recursos alocados para um processo e são a forma como o processo é executado. O thread principal executa o método maine sai. Quando um processo é executado, threads adicionais (threads filhos) podem ser gerados. Threads do mesmo processo podem trocar dados entre si. O multithreading Java requer que a sincronização de dados seja levada em consideração, não se esqueça disso. Em Java, um processo termina quando seu último thread termina. Para tarefas em segundo plano, um thread pode ser iniciado como um daemon ( daemon), a diferença de um normal é que eles serão encerrados à força quando todos os não daemonthreads do processo terminarem.

Primeiro aplicativo multithread

Existem mais de meia dúzia de maneiras de criar threads; no curso JavaRush iremos examiná-las em detalhes. Primeiro, vamos conhecer um dos básicos. Existe uma classe especial Threadno método run()na qual você precisa escrever um código que implemente a lógica do programa. Depois de criar um thread, você pode iniciá-lo chamando o método start(). Vamos escrever um programa de demonstração que implemente um exemplo 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(); //Запускаем вторую (дочерний поток)
    }
}
Vamos lançar o programa. O console exibe a saída da mensagem do thread principal. Em seguida, cada thread filho, queue1por sua vez, queue2envia mensagens para seu console comum sobre o próximo funcionário processado. Uma das opções possíveis do programa:
Начали!
Обработаны documentы: Мария
Обработаны documentы: Ivan
Обработаны documentы: Людмила
Обработаны documentы: Сергей
Обработаны documentы: Алиса
Обработаны documentы: Николай
Обработаны documentы: Карина
Обработаны documentы: Фердинанд
Обработаны documentы: Ольга
Обработаны documentы: Васorй

Process finished with exit code 0
Multithreading em Java é um tópico complexo e multifacetado. A capacidade de escrever código usando computação paralela, multitarefa e multithread ajudará você a implementar tarefas com eficácia em processadores multi-core modernos e clusters que consistem em muitos computadores.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION