2017-05-01 3 views
1

ma sortie: - Discussion client - 1 .... exécution avec l'identifiant client: null Discussion client - 4 .... exécution avec l'identifiant client: null Discussion client - 3 .... en cours d'exécution avec l'ID du client: null Client Thread - 2 .... en cours d'exécution avec l'ID client: nullObtenir null sortie pour ce programme pour chaque thread

Veuillez expliquer pourquoi null dans tous les cas. Pourquoi ne pas incrémenter la valeur enter code here

test de paquet;

class CustomerThread extends Thread { 
    static Integer custId = 0; 

    private static ThreadLocal tl = new ThreadLocal() { 
     protected Integer intialValue() { 
      return ++custId; //This ++custId is not incrementing 
     } 
    }; 

    CustomerThread(String name) { 
     super(name); 
    } 

    public void run() { 
     System.out.println(Thread.currentThread().getName() + "....executing with customer id :" + tl.get());?// tl.get() is not getting the values 
    } 
} 

class Test { 
    public static void main(String[] args) { 
     CustomerThread c1 = new CustomerThread("Customer Thread - 1"); 
     CustomerThread c2 = new CustomerThread("Customer Thread - 2"); 
     CustomerThread c3 = new CustomerThread("Customer Thread - 3"); 
     CustomerThread c4 = new CustomerThread("Customer Thread - 4"); 
     c1.start(); 
     c2.start(); 
     c3.start(); 
     c4.start(); 
    } 
} 
+0

BTW: si tout ce que vous voulez faire est de assigner un compteur de départ il est probablement préférable d'éviter les threads locaux, il suffit d'utiliser un champ avec argument constructeur ou initialiser. – eckes

Répondre

1

Vous devez réellement set() et get() pour interagir avec la variable ThreadLocal:

class CustomerThread extends Thread { 
    private static int customerID = 0; 

    private static ThreadLocal tl = new ThreadLocal<Integer>() { 
     @Override 
     protected Integer initialValue() { 
      return ++customerID; 
     } 
    }; 

    CustomerThread(String name) { 
     super(name); 
    } 

    public void run() { 
     tl.set(tl.get()); 
     System.out.println(Thread.currentThread().getName() + "....executing with customer id :" + tl.get()); 
    } 
} 

Sortie:

Customer Thread - 1....executing with customer id :1 
Customer Thread - 3....executing with customer id :3 
Customer Thread - 4....executing with customer id :4 
Customer Thread - 2....executing with customer id :2