一个类成员为空的话可以在子线程中创建吗?

ameyume
博客专家认证
2018-09-18 11:49:51
如题,有个类A的成员变量mStr,本来是在构造函数中传教的,但在某个方法的子线程中使用时发现为null,这时候可以创建吗?新创建的对象mStr与new A时创建的对象有什么区别?能在本子线程外的地方使用吗?
class A {
private String mStr;
...
A() {
mStr = new String();
}
...
mExecutorService.execute(new Runnable() {
@Override
public void run() {
try {
if (mStr != null) {
mStr = new String(); // 此处new的mStr对象属于new A()所在线程吗?
}
} catch (RemoteException e) {
Log.e(TAG, "RemoteException", e);
}
}
});
...全文
353 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoujiawei6 2018-09-18
  • 打赏
  • 举报
回复
说一下我的看法
当你调用 mExecutorService.execute的时候,就已经不跟new A()在同一个线程了。其效果跟你在main函数里调用线程赋值是一样的:

public class DoMain {
public static void main(String[] args) {
final A b = new A();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
b.str = new String();
}
});
thread.start();
}
}
class A{
public String str = new String();
}

它与new A时创建的对象的区别只是调用的顺序不同。类的加载顺序是:先初始化变量(public String str = new String();),然后再运行 代码块/构造函数/方法里的 多线程代码。如:

public class DoMain {
public static void main(String[] args) {
new A();
}
}
class A{
{
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
str = new String("b");
System.out.println(Thread.currentThread().getName().concat(" ").concat(str));
}
});
thread.start();
}
public String str = new String("a");
{
System.out.println(Thread.currentThread().getName().concat(" ").concat(str));
}
}

运行结果是:

main a
Thread-0 b

由于变量的加载优先级很高,所以一定会先于线程运行
Surrin1999 2018-09-18
  • 打赏
  • 举报
回复
可以



测试代码


public class Test4 {
public static void main(String[] args) throws Exception {
TestThread test = new TestThread();
test.startThread();
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " --- " + test.getName());
}
}

class TestThread {
String name;

public void startThread() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
if (name == null) {
name = "Hello";
System.out.println(Thread.currentThread().getName() + " --- " + name);
}
}
});
t.start();
}

public String getName() {
return this.name;
}
}


又没重新造对象 修改的还是原本对象的成员嘛 但是要注意如果有多个线程用这个方法的线程安全问题 加个锁完事

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧