Em um programa Java multithread, todos os threads não têm permissão para lançar exceções verificadas não detectadas, o que significa que cada thread precisa lidar com suas próprias exceções verificadas. Isso é limitado pela declaração do método java.lang.Runnable.run() (porque não há parte de exceção de lançamento nesta declaração de método). No entanto, o thread ainda pode lançar uma exceção não verificada. Quando tal exceção é lançada, o thread será encerrado, e o thread principal e outros threads não serão afetados, e a exceção lançada por um determinado thread não será percebida. todos (também diz que esta exceção não pode ser detectada). Este design da JVM se origina do conceito: "Threads são fragmentos de código executados de forma independente. Os problemas do thread devem ser resolvidos pelo próprio thread, em vez de delegados para o exterior. Com base neste conceito de design, em Java, as exceções do método de threads (sejam verificadas." ou exceções não verificadas) devem ser tentadas e tratadas dentro dos limites do código do thread (dentro do método run).
Mas se o encadeamento não tentar capturar uma exceção não verificada por si só, e quisermos capturar e tratar essa exceção fora dos limites do código do encadeamento (fora do método de execução), Java nos fornecerá uma maneira de capturar uma exceção quando ocorrer uma exceção dentro do thread. O mecanismo de retorno de chamada para lidar com exceções fora do limite do código do thread é o método setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) fornecido pelo objeto Thread.
Ao definir um UncaughtExceptionHandler para um thread por meio deste método, você pode garantir que quando uma exceção ocorrer no thread, a exceção poderá ser tratada chamando de volta o método public void uncaughtException(Thread t, Throwable e) da interface UncaughtExceptionHandler. ou o objetivo disso é que ele pode ser usado no thread. Fora dos limites do código (fora do método run() do Thread), há um local para lidar com exceções não detectadas. Mas o que deve ficar particularmente claro é que embora a exceção seja tratada no método de retorno de chamada, o método de retorno de chamada ainda está no thread que lançou a exceção quando é executado!
Comparado com o método acima, existe outro método de programação que pode ser usado para referência. Ou seja, às vezes o chamador do thread principal pode querer apenas saber quais exceções ocorreram durante a execução do subthread, mas pode não necessariamente. tratá-los ou tratá-los imediatamente. Então, o método de iniciar um thread filho pode coletar as instâncias de exceção lançadas pelo thread filho e devolvê-las ao chamador como uma lista de exceções, e o chamador pode decidir como responder de acordo com a situação anormal. . No entanto, é importante observar que o thread filho já foi encerrado neste momento.