"Chào, Amigo!

"Tôi muốn nói với bạn về một điều nhỏ, nhưng thú vị."

"Tôi đang lắng nghe. Tôi thích những thứ nhỏ bé và thú vị."

"Chà, bạn biết rằng mọi đối tượng Thread đều có phương thức run(). Và bạn có thể thực thi nó trên một luồng riêng biệt bằng phương thức start()."

"Vâng tất nhiên."

"Nhưng bây giờ hãy tưởng tượng tình huống này: bạn bắt đầu một luồng để thực hiện một số công việc, nhưng một ngoại lệ được đưa ra và luồng ngừng chạy vì nó không biết phải làm gì. Bạn có cần biết về lỗi này không?"

"Tôi đồng ý. Tôi cần bằng cách nào đó nắm bắt ngoại lệ xảy ra trên luồng đang chạy khác. Java có hỗ trợ điều đó không?"

"Bạn xúc phạm tôi. Tất nhiên là có."

"Những người sáng tạo Java đã phát minh ra một giao diện đặc biệt có tên là UncaughtExceptionHandler. Đây là cách bắt và xử lý một ngoại lệ xảy ra trên một luồng khác, nếu luồng đó không bắt được nó:"

Ví dụ
public class DownloadManager
{
 public static void main(String[] args)
 {
   Thread thread = new DownloadThread();
   thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
   {
    @Override
    public void uncaughtException(Thread t, Throwable e)
    {

    }
 });

 thread.start();
}

"Đối tượng Thread có một phương thức setUncaughtExceptionHandler đặc biệt . Bạn cần truyền cho nó một đối tượng cài đặt giao diện Thread.UncaughtExceptionHandler . Giao diện này chỉ có một phương thức: uncaughtException(Thread t, Throwable e) . Đây là phương thức sẽ được gọi trên đối tượng đã truyền nếu một ngoại lệ chưa được phát hiện xảy ra trong phương thức chạy."

"Trong ví dụ của tôi ở trên, tôi chỉ cần khai báo một lớp bên trong ẩn danh (được đánh dấu bằng màu đỏ) thực hiện giao diện Thread. Thread.UncaughtExceptionHandler . Và tôi ghi đè phương thức uncaughtException(Thread t, Throwable e) của nó."

"Như bạn có thể thấy từ danh sách tham số của phương thức, hai đối số sẽ được truyền: một tham chiếu đến đối tượng Chủ đề nơi xảy ra ngoại lệ và chính ngoại lệ đó, được truyền dưới dạng Throwable e."

"Chà, tại sao tôi cần biến Chủ đề t? Chúng ta không biết chúng ta đang đặt một đối tượng Thread.UncaughtExceptionHandler vào Chủ đề nào sao?"

"Họ đã làm điều này để bạn có thể viết một trình xử lý chung cho các tình huống này. Tức là bạn có thể tạo một đối tượng duy nhất và chuyển nó tới hàng chục luồng khác nhau. Sau đó, phương thức uncaughtException( Thread t, Throwable e) luôn cung cấp cho bạn một tham chiếu đến Đối tượng chủ đề nơi xảy ra ngoại lệ."

"Hơn nữa, bạn có thể tạo hàng tá luồng, chẳng hạn như trong một vòng lặp để thực hiện các tác vụ cụ thể. Nói chung, tham chiếu này đến đối tượng Thread sẽ không thừa. Tôi hứa với bạn điều đó."

"Ta tin ngươi. Ngươi chưa bao giờ sai."