Se você está estendendo Thread não precisa necessariamente implementar o metodo run(), seria necessario caso você implementasse Runnable. Como você não vai precisar de um metodo run, então pode criar um metodo que retorne listaMsg, e a partir daí você pode usar o retorno dessa ArrayList em um metodo de consulta
rmendes08
E porque alguém estenderia a classe Thread a não ser para sobrescrever run() ?
Jonas_B_a_r_r_o_s
Você pode usar tranquilamente uma classe que estenda de Thread sem implemetar o run(). O metodo run() funciona como o metodo main(). Por exemplo, se você quer que um codigo execute primeiro em sua classe, então coloque o run() nela. Mas, nem sempre isso se adequa ao que você pretende fazer em seu programa.
Runnable é uma interface que estende de Thread. Essa interface está la com seu unico metodo run() pronta para ser chamada caso você precise do run() em seu codigo. Mas, digamos que não precise, então não implemente Runnable, porque se não obrigatoriamente você devera usar o run().
Porque não usar o run() numa Trhead? Oras, as funcionalidades das Threads
As Threads tem muitos metodos bem uteis, dá uma pesquisada ai…