1. 程式人生 > >Java多執行緒之執行緒池(二)

Java多執行緒之執行緒池(二)

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());

}

}