2011-12-28 18 views
6

इस कोड है:"थ्रेड.current थ्रेड()। GetName" और "this.getName" के बीच क्या अंतर है?

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")); 
    } 

} 

और उत्पादन होता है:

थ्रेड नाम है: Gemoji
थ्रेड-1

से तो पकड़ java.lang.RuntimeException मैं कोड

System.out.println("Thread name is: " + this.getName()); 
बदल गया

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

के उत्पादन

थ्रेड नाम करने के लिए बदल जाएगा: थ्रेड-1 थ्रेड-1

क्यों से
पकड़ java.lang.RuntimeException?

उत्तर

6

मुझे लगता है कि एक पल में, UnCatchExceptionThread आपके HandlerFactory.newThread() विधि को पास कर दिया गया है, और इस विधि द्वारा लौटाया गया थ्रेड निष्पादित किया गया है। यदि ऐसा है, तो आप कोई नाम नहीं के साथ एक नया धागा बनाते हैं, जो रननेबल को तर्क के रूप में पास करता है। रननेबल UnCatchExceptionTread उदाहरण है, लेकिन निष्पादित थ्रेड new Thread(r) है।

तो, रननेबल run विधि के अंदर, this UnCatchExceptionThread का उदाहरण है, और उसका नाम आपने उसे दिया है। लेकिन वर्तमान धागा new Thread(r) है, जिसका एक डिफ़ॉल्ट नाम है।

+0

मैं भूल जाता हूं कि 'थ्रेडफैक्टरी' को 'रननेबल' को सर्वो के रूप में स्वीकार किया जाता है, और 'थ्रेड' भी 'रननेबल' लागू करता है। आपकी सहायता के लिए धन्यवाद. – PeaceMaker

0

निष्पादक सेवा दिए गए रननेबल से रन कमांड चलाने के लिए थ्रेड "थ्रेड -1" बना रहा है। तो थ्रेड ऑब्जेक्ट नाम "जेमोजी" असली धागा नहीं चल रहा है।

संबंधित मुद्दे