Não sei se já resolveu, mas vamos lá, primeiramente pelo que vi, ele criou um classe chamada minha MinhaThread e deu um extends em Thread que já é uma classe interna do java (geralmente se utiliza Thread para que tenha mais de um processo sendo executado ao mesmo tempo ou paralelamente), criou uma variável mensagem e criou um construtor de MinhaThread para ser passada a mensagem através desse construtor já que a mensagem é privada, logo depois fez a implementação do método run, Obs: Quando ele deu extends no Thread essa classe automaticamente passa a ter os métodos, start e join, o método start inicia o uma thread que no caso é um run, toda vez que se chama o start ele procura o metodo run, por isso dele implementar esse metodo run, que no caso é a ação, nesse caso a ação é imprimir a mensagem passada 10x atraves do for ali. Depois ele parte para a classe principal onde cria 3 objetos (a,b,c) do tipo MinhaThread e passa como argumento de mensagem em cada objeto A, B, C, ou seja no objeto 'a' a mensagem vai ser A, no objeto 'b' vai ser B e no objeto 'c' vai ser C. Logo ele chamada os metodos a start(), esse metodo incia o metodo run, e depois ele chama o metodo join(), esse metodo join é chamado para que o programa espere o run do primeiro objeto terminar para depois chamar os outros.
Agora sobre sua resposta: Ele vai imprimir na tela essa sequencia: A A A A A A A A A A B B B B B B B B B B C C C C C C C C C C. Ou seja ele ira imprimir na tela A (10x) e B (10x) e C (10x), como ele colocou um join() entre a chamada as threads significa que a próxima thread só é executada quando a em execução terminar o serviço.
Caso queira dar uma olhada sobre Thread: https://www.javatpoint.com/creating-thread
A teste de curiosidade executel as classes, segue:
MinhaThread.java
Main.java
Obs: Tive que colocar um try catch no metodo join se não ele não deixava compilar o código, isso é apenas para caso dê erro, ele mostrar uma mensagem.
Resultado: