Noções Básicas sobre Multithreading Java Criando e Executando Threads em Java com Exemplos

Noções básicas conceituais de multithreading

Normalmente, quando falamos de multi-programação nos referimos a vários programas em execução em um processador. Um programa é um conjunto de instruções que, quando executado, fornece uma funcionalidade específica. Um exemplo de um programa comumente usado é um processador de texto, como o MS Word. Do ponto de vista do sistema operacional, executar instâncias de programas são processos individuais, com cada processo tendo seu próprio espaço de endereço de memória alocado a ele.

À medida que um processo é executado, pode ser necessário cuidar de várias tarefas internas em paralelo para fornecer o conjunto completo de funcionalidades que ele oferece. Por exemplo, como uma pessoa digita no processador de texto, há várias tarefas sendo executadas em segundo plano. Uma tarefa é responsável por salvar as alterações no documento em um arquivo de recuperação. Outra tarefa verifica erros ortográficos e gramaticais conforme o usuário digita. Ainda outra tarefa faz a tarefa básica de exibir o que um usuário digita no editor e assim por diante.

Todas as tarefas acima mencionadas são internas ao programa processador de texto, isto é, elas compartilham o mesmo espaço de endereço de memória que foi alocado para o processador de texto pelo sistema operacional. Ao mesmo tempo, essas tarefas internas precisam ser executadas em conjunto ou em paralelo para garantir que as funcionalidades do programa estejam disponíveis para seus usuários ao mesmo tempo. Cada uma dessas tarefas paralelas são as menores unidades de trabalho independente realizadas pelo programa e são exemplos de trabalho individual para fazer todo o programa funcionar em conjunto.

Resumir a relação entre programas, processos e. Um programa em execução é um processo, e um processo em execução pode ter várias execuções paralelas dentro dele para executar várias tarefas que o processo precisa executar. O diagrama abaixo descreve a relação entre processos e.

Java é a menor unidade de código dispatchable que pode ser executada. Como o programa maior é executado em um espaço de processo próprio, seus múltiplos internos executam suas tarefas individuais e se comunicam entre si para fazer o programa funcionar como um todo. Esses encadeamentos internos de trabalho usam uma parte do espaço de endereço de memória alocado para seu programa / processo pai. Como veremos em detalhes nos próximos tutoriais sobre gerenciamento de simultaneidade, esse compartilhamento de espaço de memória tem vantagens (comunicação entre threads) e desvantagens (problemas de sincronização).

As classes de gerenciamento de encadeamentos em Java são todas projetadas em torno do gerenciamento do paralelismo interno do trabalho ao longo de todo o ciclo de vida - da criação à destruição. Ao estudar os recursos básicos e avançados para multithreading em Java neste e nos próximos tutoriais da série Java Concurrency, abordaremos todos os aspectos relacionados à definição, gerenciamento e otimização.

Para executar uma parte da funcionalidade em paralelo, você precisará primeiro encapsulá-la como um thread separado e depois executá-la. Vamos agora aprender como definir e executar instâncias individuais de acordo com nossas necessidades.

Criando e executando um definido pela extensão da classe Thread

A primeira maneira de definir sua própria funcionalidade de encadeamento envolve subclassificar a classe java.lang.Thread. Uma instância da classe Thread contém um único encadeamento de execução de um programa em execução.

A criação de um novo thread paralelo usando a classe Thread envolve as 3 etapas a seguir -

Criando e executando um encadeamento definido pela implementação da interface Runnable

A segunda maneira de criar um thread paralelo é implementando a interface java.lang.Runnable. Existem 4 etapas envolvidas na criação e execução de um thread separado usando Runnable -