java.util.concurrent包是jdk1.5以后使用的线程库,在jdk1.5之前主要使用java.lang和java.util中的类实现
package three.day.thread;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadLocalTest {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(2);//创建一个固定大小为2的线程池
Runnable runnable = new Runnable(){
A a = new A();
public void run() {
MyData.getMyDate().setY(new Random().nextInt(10000));
a.say();
}
};
//相当于new Thread(runnable).start(); 这里在底层封装了一下
service.execute(runnable);service.execute(runnable);
service.shutdown();
}
}
class MyData{
public static ThreadLocal x = new ThreadLocal();
public static void set(Object value){
x.set(value);
}
public static Object get(){
return x.get();
}
//ThreadLocal在java.lang包中,可以存放不同线程的数据,也就是说不同的线程从ThreadLocal拿到的数据应该都是本线程的
private static ThreadLocal data = new ThreadLocal();
/*对于不同的线程来说,getMyData拿到的对象都不相同,
* 对同一个线程来说,不管getMyData多少次和在哪里getMyData,拿到的都是同一个*/
public static MyData getMyDate(){
MyData myData = (MyData)data.get();
if(myData == null){
myData = new MyData();
data.set(myData);
}
return myData;
}
private MyData(){}
private Integer y;
public void setY(Integer y){
this.y = y;
}
public Integer getY(){
return y;
}
}
class A{
public void say(){
System.out.println("say " + Thread.currentThread().getName() + " geted " + MyData.getMyDate().getY());
new B().sayHello();
}
}
class B{
public void sayHello() {
System.out.println("sayHello " + Thread.currentThread().getName() + " geted " + MyData.getMyDate().getY());
}
}