代码:(第一种)
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);
}
}
}
运行成功:
数据跟着线程走。