Java多執行緒之執行緒池(二)
阿新 • • 發佈:2019-01-02
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.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());
}
}