2011-12-28 44 views
6

Đây là mã:Sự khác biệt giữa "Thread.currentThread(). GetName" và "this.getName" là gì?

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ThreadFactory; 


class UnCatchExceptionThread extends Thread{ 
    public UnCatchExceptionThread(String name){ 
     this.setName(name); 
    } 
    @Override 
    public void run() { 
     System.out.println("Thread name is: " + this.getName()); 
     throw new RuntimeException(); 
    } 
} 

class UnCatchExceptionHandler implements Thread.UncaughtExceptionHandler{ 
    @Override 
    public void uncaughtException(Thread t, Throwable e) { 
     System.out.println("catch " + e + " from " + t.getName()); 
    } 
} 

class HandlerFactory implements ThreadFactory{ 

    @Override 
    public Thread newThread(Runnable r) { 
     Thread t = new Thread(r); 
     t.setUncaughtExceptionHandler(new UnCatchExceptionHandler()); 
     return t; 
    } 

} 
public class CaptureException { 

    public int i; 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     ExecutorService exec = Executors.newCachedThreadPool(new HandlerFactory()); 
     exec.execute(new UnCatchExceptionThread("Gemoji")); 
    } 

} 

Và kết quả là:

tên chủ đề là: Gemoji
bắt java.lang.RuntimeException từ Chủ đề-1

Nếu tôi đã thay đổi mã

System.out.println("Thread name is: " + this.getName()); 

để

System.out.println("Thread name is: " + Thread.currentThread().getName()); 

Sản lượng sẽ thay đổi để

tên chủ đề là: Chủ đề-1
bắt java.lang.RuntimeException từ Chủ đề-1

Tại sao?

Trả lời

6

Tôi giả sử rằng tại một thời điểm, UnCatchExceptionThread được chuyển đến phương thức HandlerFactory.newThread() của bạn và chuỗi được trả về bằng phương pháp này được thực thi. Nếu vậy, bạn tạo một chủ đề mới không có tên, thực thi runnable được truyền làm đối số. Runnable là thể hiện UnCatchExceptionThread, nhưng luồng đang thực thi là new Thread(r).

Vì vậy, bên trong phương thức Runnable run, this là phiên bản của UnCatchExceptionThread và có tên bạn đã cung cấp cho anh ấy. Nhưng luồng hiện tại là new Thread(r), có tên mặc định.

+0

Tôi quên rằng 'ThreadFactory' chấp nhận' Runnable' làm param và 'Thread' cũng triển khai' Runnable'. Cảm ơn bạn đã giúp đỡ. – PeaceMaker

0

Dịch vụ thi hành đang tạo chuỗi "Thread-1" để chạy lệnh chạy từ runnable đã cho. Vì vậy, tên đối tượng của chuỗi "Gemoji" không phải là chuỗi thực đang được chạy.

Các vấn đề liên quan