需求
创建5个线程,需在线程的run()中设置"存储数据"、“获取/输出数据”,观察某些线程会不会获取到其他线程的数据
一、普通变量(不可行)
1、原因
(1) 通过for循环,会给每个线程1个threadData
(2) 而每个线程的threadData的作用域仅限于run()中
(3) 由于自定义普通变量的作用域局限性,并不能通过threadData体现线程之间的相互干扰
(4) 即由于变量的作用域,线程A不能获取到线程B的数据
2、MainThread
public class MainThread {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
String threadData = null;
new Thread(new Runnable() {
@Override
public void run() {
threadData = Thread.currentThread().getName() + "'s Data";
System.out.println(Thread.currentThread().getName() + ": " + threadData);
}
}).start();
}
}
}
//Console:
Thread-0: Thread-0's Data
Thread-1: Thread-1's Data
Thread-2: Thread-2's Data
Thread-3: Thread-3's Data
Thread-4: Thread-4's Data
二、成员变量(可行)
1、原因
(1) 通过在其他类new一个threadData所在类的对象,使得threadData的Set、Get可在其他类中使用,实现threadData跨域的存储数据、获取数据
(2) 由于是类中方法,有对象就可调用,不像普通变量一样会受到局部作用域的影响,可理解为"自由作用域"
(3) 因此各线程都可能获取到其他线程的数据
(4) 在实际应用中,线程中使用的数据一般来自线程外,不像自定义普通变量一样在线程的run()中自产自销,因此成员变量 + Set、Get更合适
2、DataMedia
public class DataMedia {
private String threadData;
public String getThreadData() {
return threadData;
}
public void setThreadData(String threadData) {
this.threadData = threadData;
}
}
3、MainThread
public class MainThread {
public static void main(String[] args) {
DataMedia dm = new DataMedia();
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
@Override
public void run() {
dm.setThreadData(Thread.currentThread().getName() + "'s Data");
System.out.println(Thread.currentThread().getName() + ": " + dm.getThreadData());
}
}).start();
}
}
}
//Console:
Thread-4: Thread-4's Data
Thread-3: Thread-3's Data
Thread-0: Thread-0's Data
Thread-1: Thread-1's Data
Thread-2: Thread-0's Data