Ybadoo - Soluções em Software Livre
Turmas
1º Semestre de 2026

Na ciência da computação, concorrência é a capacidade de diferentes partes ou unidades de um programa serem executadas fora de ordem ou em ordem parcial, sem afetar o resultado. Isso permite a execução paralela de unidades simultâneas, o que pode melhorar significativamente a velocidade geral de execução em sistemas multiprocessadores e multinúcleos. Em termos mais técnicos, concorrência refere-se à decomposição de um programa em componentes independentes de ordem ou parcialmente ordenados. Considere a função apresentada a seguir, apresentada na linguagem de programação Pascal, que executa de forma recursiva a pesquisa do maior elemento de um array, decompondo esse array em partes menores até ser possível realizar a comparação de dois elementos ou retornar o valor do próprio elemento.

function maior(inicio: integer; fim: integer; vetor: array of integer): integer;
var dif, meio, first, second: integer;
begin
dif := fim - inicio;
if dif > 1 then
begin
meio := dif div 2;
first := maior(inicio, inicio + meio, vetor);
second := maior(inicio + meio + 1, fim, vetor);
if first > second
then maior := first
else maior := second
end
else
begin
if dif = 0
then maior := vetor[inicio]
else
begin
if vetor[inicio] > vetor[fim]
then maior := vetor[inicio]
else maior := vetor[fim]
end;
end;
end;

Converta a função apresentada para ser executada de forma concorrente, utilizando a linguagem de programação de sua preferência, desde que a mesma tenha suporte à concorrência.

public class Biggest extends Thread
{
private int inicio;

private int fim;

private int[] vetor;

public int maior;

public Biggest(final int inicio, final int fim, final int[] vetor)
{
this.inicio = inicio;

this.fim = fim;

this.vetor = vetor;
}

public void run()
{
final var dif = fim - inicio;

if (dif > 1)
{
final var meio = dif % 2;

final var first = new Biggest(inicio, inicio + meio, vetor);

final var second = new Biggest(inicio + meio + 1, fim, vetor);

first.start();

second.start();

try
{
first.join();

second.join();
}
catch (final Exception exception)
{
exception.printStackTrace();
}

maior = (first.maior > second.maior) ? first.maior : second.maior;
}
else
{
if (dif == 0)
{
maior = vetor[inicio];
}
else
{
maior = (vetor[inicio] > vetor[fim]) ? vetor[inicio] : vetor[fim];
}
}
}

public static void main(String[] args)
{
int[] valores = {80, 25, 30, 35, 5, 55, 10, 60, 45, 10, 65};

final var app = new Biggest(0, valores.length - 1, valores);

app.run();

System.out.println(app.maior);
}
}