您的位置:首页 > 编程语言 > Java开发

java多线程学习(三)---线程范围内数据共享

2017-11-30 22:07 423 查看
初次尝试

public class ThreadScopeShareData {

private static int data = 0;
public static void main(String[] args) {
for (int i = 0; i <2 ; i++) {
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() + " get data :" + data);
}
}

static class B{
public void get(){
System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data);
}
}

}




发现取得的数据不正确

修改代码,再次尝试

public class ThreadScopeShareData {

private static int data = 0;
private static Map<Thread,Integer> threadDate = new HashMap<Thread,Integer>();
public static void main(String[] args) {
for (int i = 0; i <2 ; i++) {
new Thread(new Runnable() {
@Override
public void run() {
data = new Random().nextInt();
System.out.println(Thread.currentThread().getName() + "has put data :" + data);
threadDate.put(Thread.currentThread(),data);
new A().get();
new B().get();
}
}).start();
}
}

static class A{
public void get(){
int data =threadDate.get(Thread.currentThread());
System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data);
}
}

static class B{
public void get(){
int data =threadDate.get(Thread.currentThread());
System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data);
}
}
}




数据获取正确

也可以使用ThreadLocal来实现

public class ThreadLocalTest {

private static ThreadLocal<Integer> x = new ThreadLocal<Integer>();
public static void main(String[] args) {
for (int i = 0; i <2 ; 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() + " get data :" + data);
}
}

static class B{
public void get(){
int data =x.get();
System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data);
}
}
}




效果相同
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程