代碼:(第一種)
package keeper;
import java.util.Date;
import java.util.Random;
public class Test {
private static int data = 0;
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
data = new Random().nextInt();
System.out.println(Thread.currentThread().getName()+"has put data:"+data);
new A().get();
new B().get();
}
}).start();
}
static class A{
public void get() {
System.out.println("A from"+Thread.currentThread().getName()+"has get data:"+data);
}
}
static class B{
public void get() {
System.out.println("B from"+Thread.currentThread().getName()+"has get data:"+data);
}
}
}
運行結果:
看到結果:很明顯Thread-0的值並沒有賦進去
解決辦法:(第二種)
package keeper;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class Test {
private static Map<Thread,Integer> threadData = new HashMap<Thread,Integer>();
public static void main(String[] args) {
for(int i = 1;i<=3;i++) {
new Thread(new Runnable(){
@Override
public void run() {
int data = new Random().nextInt();
System.out.println(Thread.currentThread().getName()+"has put data:"+data);
threadData.put(Thread.currentThread(), data);
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get() {
int data = threadData.get(Thread.currentThread());
System.out.println("A from"+Thread.currentThread().getName()+"has get data:"+data);
}
}
static class B{
public void get() {
int data = threadData.get(Thread.currentThread());
System.out.println("B from"+Thread.currentThread().getName()+"has get data:"+data);
}
}
}
運行結果:
第二種方法確定:需要手動移除不需要的數據,否則新線程不斷向map集合添加數據,最終導致內存溢出。(線程不安全)
第三種方法:
package keeper;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class Test {
static ThreadLocal<Integer> x = new ThreadLocal<Integer>();
public static void main(String[] args) {
for(int i = 1;i<=3;i++) {
new Thread(new Runnable(){
@Override
public void run() {
int data = new Random().nextInt();
System.out.println(Thread.currentThread().getName()+"has put data:"+data);
x.set(data);
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get() {
int data = x.get();
System.out.println("A from"+Thread.currentThread().getName()+"has get data:"+data);
}
}
static class B{
public void get() {
int data = x.get();
System.out.println("B from"+Thread.currentThread().getName()+"has get data:"+data);
}
}
}
運行成功:
數據跟着線程走。